2013-06-03 15 views
5

wyślę ciało JSON Prześlij do mojego serwisu WWW PHP, który wygląda mniej więcej tak:Unicode w PHP JSON

{ 
    "foo": "☺" 
} 

Kiedy echo z ciała w PHP, widzę to:

{ 
    "foo":"\xe2\x98\xba" 
} 

próbowałem również wysyłanie \uXXXX równoważne:

{ 
    "foo": "\u263a" 
} 

to ma dalej, że surowy JSON ciąg odbierać d miał "foo":"\\u263a", ale po json_decode wartość zmieniła się na \xe2\x98\xba.

Powoduje to problemy, gdy używam wartości w odpowiedzi JSON. I otrzymujemy:

json_encode(): Invalid UTF-8 sequence in argument 

Mówiąc najprościej, jest to, co się dzieje, dlaczego próbuję JSON zakodować ciąg:

> php -r 'echo json_encode("\x98\xba\xe2");' 
PHP Warning: json_encode(): Invalid UTF-8 sequence in argument in Command line code on line 1 

Moje pytanie brzmi:: jak mogę najlepiej dostać tę buźkę z jednej koniec mojej aplikacji do drugiej?

Byłbym wdzięczny za każdą pomoc, jaką mógłbyś zaoferować.

+1

W jaki sposób "[...] odbijacie od ciała [...]"? – PleaseStand

+1

'echo" \ xe2 \ x98 \ xba ";' działa; pokazuje prawidłowy smilie Unicode. –

+0

@PleaseStand Wysłałem go do error_log z 'error_log (file_get_contents ('php: // input'))'. –

Odpowiedz

2

Uważam, że jest to prawidłowe zachowanie json_encode. Jeśli użyć następujących:

<script> 
    alert(
    <?php 
     $a = "☺"; 
     echo json_encode($a); 
    ?> 
    ); 
</script> 

Wyjście HTML będzie alert("\u263a"); i nieczysto pokaże od "\u263a" jest poprawna reprezentacja ciąg w JavaScript.

Używanie stałej JSON_UNESCAPED_UNICODE jako drugiego parametru json_encode w PHP jest również opcją, ale dostępne tylko dla PHP 5.4.0 lub nowszego.

W jakim scenariuszu zamierzasz użyć wartości?


Edycja:

php -r echa json_encode ("\ x98 \ Xba \ xe2"); '

PHP Warning: json_encode(): nieprawidłowy UTF-8 sekwencja argumentów w linii komend kodu na linii 1

problemu jest użyć złego sekwencję znaków. Powinno być

echo json_encode("\xe2\x98\xba"); // this works for me 

zamiast

echo json_encode("\x98\xba\xe2"); 
+0

Myślę, że coś tu masz. Wartość musi zostać zwrócona jako JSON i właśnie tam mam problem. –

+0

@rossmcf Więc chcesz wysłać ciąg znaków z tą postacią jako odpowiedź JSON z PHP, prawda? A czym jest problem? Jeśli odpowiedź JSON jest przetwarzana przez JavaScript, powinna zachowywać się poprawnie, nawet jeśli wynikiem jest '\ u26aa' zamiast' ☺'. – Mifeet

+0

Problem polega na tym, że json_encode nie koduje '' \ x98 \ xba \ xe2'', przynajmniej w mojej wersji PHP. –

1

myślę kiedy kodować trzeba użyć json_encode({ foo": "☺"}, JSON_UNESCAPED_UNICODE)

Zasadniczo json_encode funkcja działa tylko dla kodowania UTF-8, tak przed zakodować sprawdzić kodowanie łańcucha, tak jak to.

mb_check_encoding("your string", 'UTF-8') ; 

razie zwraca false wtedy można przekonwertować do UTF-8 za pomocą

utf8_encode("your string"); 
+0

Dzięki Arun. Kiedy wypróbowałem twoją sugestię, json_encode wyświetliło się: "\ u0098 \ u00ba \ u00e2", czyli trzy inne znaki. –

2

json_decode() funkcja PHP zachowuje się prawidłowo podano sprawę wejściowego, wracając sekwencję UTF-8 bajtów (E2 98 BA), które reprezentują charakter .

Jednak Apache HTTPD stosuje \x escaping (w funkcji ap_escape_logitem()) przed wpisaniem wiersza do dziennika błędów (tak jak w przypadku testów za pomocą error_log()). Jak odnotowano w pliku server/gen_test_char.c, "wszystkie [...] 8-bitowe znaki z wysokim zestawem bitów" są unikane.

+0

Aha! Dziękuję za to. –