2016-07-20 14 views
5

Poszerzyłem to zachowanie w PHP 5.6 (również identyczne w PHP 5.4 do 7.0).Dlaczego json_encode ciąg białych znaków dodaje je do tablicy?

$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); 

Wyjścia:

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

nie musi być powodem takiego zachowania, chciałbym zrozumieć. A także, jeśli znasz sposób, aby zmusić go do zachowania się w taki sam sposób dla ciągów tekstów i białych znaków, byłbym wdzięczny za podzielenie się swoimi pomysłami!

Edytuj. Oto urywek można uruchomić: http://sandbox.onlinephpfunctions.com/code/d797623553c11b7a7648340880a92e98b19d1925

+0

nie mogę odtworzyć tego z PHP 5.5.9. dla mnie string3 i string4 są po prostu pustymi białymi znakami. jednak, co ciekawe, znaki białych znaków są traktowane dosłownie tak samo, jak w przykładzie dla string1 i string2. –

+0

Dodano snipped w moje pytanie. – Vallieres

+0

@JeffPuckettII masz rację 5.5, ale większość wersji 5.6 produkuje powyższy wynik. I wszystkie wersje PHP 7 mogę przetestować. – Vallieres

Odpowiedz

1

ten pochodzi z RFC 4627 (kopalnia nacisk)

znaków Wszystko Unicode mogą być umieszczone w cudzysłowie wyjątkiem znaków, które muszą być ocalałem: cudzysłów, reverse solidus i znaki kontrolne (U + 0000 do U + 001F).

linia (\n) jest U+000A UTF-8 tak PHP sumiennie przekształca go z powrotem do odpowiednich JS równoważnych

PHP wykorzystuje ten RFC dla json_encode

PHP realizuje nadzbiór JSON jako określone w oryginalnym »RFC 4627 - będzie również kodować i dekodować typy skalarne i NULL.

Jak zauważył w komentarzach, wszystkie wersje PHP, wracając do 5,2, zrobić to w ten sposób (Demo)

+0

dziwne, że powoduje to [problemy z dekodowaniem dla innych] (http: // stackoverflow.com/q/42068/4233593) po usunięciu znaku "\ n" zamiast '\\ n' –

+0

Może go nie rozumiem, ale w jaki sposób kodowanie tego znaku kończy się na {" 0 ":" \ n \ n \ n "} formularz zamiast" ciąg "? – Vallieres

+1

@Vallieres Myślę, że to ze względu na konwersję SimpleXML. Jeśli umieścisz go w tablicy tak jak ja, to nie zrobi tego. Pchnąłem SXML z powrotem za kopnięcia i przerobiłem go i dostałem wszelkiego rodzaju wackiness https://3v4l.org/kKfrL – Machavity

Powiązane problemy