2013-06-03 13 views
5

Ich bin ein JSON-POST Körper zu meinem PHP-Web-Service senden, die etwa wie folgt aussieht:PHP Unicode in JSON

{ 
    "foo": "☺" 
} 

Wenn ich den Körper in der PHP-Echo aus, sehe ich:

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

ich auch die \uXXXX Äquivalent versucht haben, zu senden:

{ 
    "foo": "\u263a" 
} 

Diese weitere bekam, dass in der rohen String JSON erhalten d hatte "foo":"\\u263a", aber nach json_decode der Wert wandte sich an \xe2\x98\xba.

Das verursacht Probleme, wenn ich den Wert in einer JSON-Antwort verwende. Ich bekomme:

json_encode(): Invalid UTF-8 sequence in argument 

Am einfachsten ist es das, was warum passiert, ich JSON versuchen, die Zeichenfolge kodieren:

> 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 

Meine Frage ist: Wie kann ich am besten erhalten diese Smiley-Gesicht von einem Ende meiner Bewerbung an die andere?

Ich würde jede mögliche Hilfe schätzen, die Sie anbieten konnten.

+1

Wie hast du "[...] den Körper [...] ausgestrahlt"? – PleaseStand

+1

'echo" \ xe2 \ x98 \ xba "; funktioniert; zeigt den korrekten Unicode-Smilie. –

+0

@PleaseStand Ich habe es mit 'error_log (file_get_contents ('php: // input'))' an error_log gesendet ''. –

Antwort

2

Ich glaube, das ist das korrekte Verhalten von json_encode.

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

Die HTML-Ausgabe alert("\u263a"); sein wird, und der Alarm wird zeigen seit "\u263a" ist eine korrekte Darstellung der Zeichenfolge in JavaScript: Wenn Sie die folgenden verwenden.

Verwendung von JSON_UNESCAPED_UNICODE Konstante als der zweite Parameter von json_encode in PHP ist auch eine Option, aber nur für PHP 5.4.0 oder neuer.

In welchem ​​Szenario beabsichtigen Sie, den Wert zu verwenden?


Edit:

php -r 'echo json_encode ("\ x98 \ Xba \ XE2");'

PHP Warning: json_encode(): Ungültige UTF-8-Sequenz in Argumente in der Befehlszeile code on line 1

Das Problem ist, dass Sie eine falsche Folge von Zeichen verwendet werden. Es sollte

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

statt

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

Ich denke du bist hier etwas. Der Wert muss als JSON zurückgegeben werden, und hier habe ich Probleme. –

+0

@rossmcf Sie möchten also eine Zeichenfolge mit diesem Zeichen als JSON-Antwort von PHP senden, oder? Und was ist das Problem? Wenn die JSON-Antwort von JavaScript verarbeitet wird, sollte sie sich korrekt verhalten, auch wenn das Ergebnis '\ u263a' anstelle von' ☺' ist. – Mifeet

+0

Das Problem ist, dass json_encode '' x98 \ xba \ xe2'', zumindest in meiner Version von PHP, nicht verschlüsseln wird. –

1

sein denke ich, wenn Sie kodieren Sie json_encode({ foo": "☺"}, JSON_UNESCAPED_UNICODE)

Grundsätzlich json_encode Funktion ist nur für UTF-8-Codierung verwenden müssen also, bevor Sie das überprüfen kodieren Codierung von String, so.

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

wenn es false zurückgibt, dann können Sie in UTF-8 konvertieren mit

utf8_encode("your string"); 
+0

Danke Arun. Als ich Ihren Vorschlag ausprobierte, gab json_encode Folgendes aus: "\ u0098 \ u00ba \ u00e2", was insgesamt drei weitere Zeichen sind. –

2

PHP json_decode() Funktion Ihre Eingabe Fall korrekt angegeben verhält, die Reihenfolge der UTF-8 Bytes Rückkehr (E2 98 BA), der die Zeichen darstellen .

gilt jedoch Apache HTTPD die \x (in Funktion ap_escape_logitem()) entkommen, bevor die Zeile in das Fehlerprotokoll zu schreiben (wie Sie zu Testzwecken haben error_log() verwenden). Wie in der Datei server/gen_test_char.c angegeben, sind "alle [...] 8-Bit-Zeichen mit dem gesetzten hohen Bit" maskiert.

+0

Aha! Dank dafür. –