2016-07-20 47 views
5

Ich habe dieses Verhalten auf PHP 5.6 (auch in PHP 5.4 bis 7.0 identisch) stummled.Warum fügt json_encode einer Whitespace-Zeichenfolge ein Array hinzu?

$note = new SimpleXMLElement('<Note></Note>'); 
$note->addChild("string0", 'just a string'); 
$note->addChild("string1", "abc\n\n\n"); 
$note->addChild("string2", "\tdef"); 
$note->addChild("string3", "\n\n\n"); 
$note->addChild("string4", "\t\n"); 

$json = json_encode($note, JSON_PRETTY_PRINT); 

print($json); 

Ausgänge:

{ 
    "string0": "just a string", 
    "string1": "abc\n\n\n", 
    "string2": "\tdef", 
    "string3": { 
     "0": "\n\n\n" 
    }, 
    "string4": { 
     "0": "\t\n" 
    } 
} 

Es muss ein Grund für dieses Verhalten sein, würde ich gerne verstehen. Und auch wenn Sie wissen, wie man es zwingen kann, sich bei Texten und Leerzeichen so zu verhalten, würde ich mich freuen, wenn Sie Ihre Ideen teilen!

Bearbeiten. Hier ist ein Ausschnitt Sie ausführen können: http://sandbox.onlinephpfunctions.com/code/d797623553c11b7a7648340880a92e98b19d1925

+0

I 5.5.9 dieses mit PHP nicht wiedergeben kann. Für mich sind string3 und string4 nur leere Leerzeichen. Wie auch immer, merkwürdigerweise werden die Whitespace-Zeichen genauso wie in Ihrem Beispiel für String1 und String2 verwendet. –

+0

Hinzugefügt die in meiner Frage geschnippt. – Vallieres

+0

@JeffPuckettII Sie sind auf 5.5, aber die meisten 5.6 Versionen produzieren das obige Ergebnis. Und alle Versionen von PHP 7 konnte ich testen. – Vallieres

Antwort

1

Das kommt von RFC 4627 (Hervorhebung von mir)

Alle Unicode-Zeichen können mit Ausnahme der Zeichen innerhalb der Anführungszeichen gesetzt werden, die entgangen sein: Anführungszeichen, Reverse Solidus und die Steuerzeichen (U + 0000 bis U + 001F).

Newline (\n) ist U+000A in UTF-8 so PHP es dutifully zurück zu seiner jeweiligen JS wandelt äquivalente

PHP verwendet diese RFC für json_encode

PHP implementiert ein Superset der JSON als spezifiziert in der ursprünglichen »RFC 4627 - es wird auch skalare Typen und NULL kodieren und dekodieren.

Wie ich in den Kommentaren angegeben, sind alle Versionen von PHP, auf 5,2 zurück, tun es auf diese Weise (Demo)

+0

seltsam, dass dies [Decodierungsprobleme für andere] verursacht (http: // stackoverflow.com/q/42068/4233593) wenn ich als '\ n' anstelle von' \\ n' unescapiert wurde –

+0

Ich verstehe es vielleicht nicht, aber wie kommt diese Zeichenkodierung in {"0": \ n \ n \ n "} Form statt" String "? – Vallieres

+1

@Vallieres Ich denke, das ist wegen der SimpleXML-Konvertierung. Wenn Sie es in ein Array wie ich getan haben, tut es das nicht. Ich schob die SXML zurück für Kicks und ranan und bekam allerlei Verrücktheit https://3v4l.org/kKfrL – Machavity