2013-05-11 8 views
79

Ho uno script PHP che si occupa di un'ampia varietà di lingue. Sfortunatamente, ogni volta che provo a usare json_encode, qualsiasi output Unicode viene convertito in entità esadecimali. È questo il comportamento previsto? C'è un modo per convertire l'output in caratteri UTF-8?Perché la funzione json_encode di PHP converte le stringhe UTF-8 in entità esadecimali?

Ecco un esempio di quello che sto vedendo:

INPUT

echo $text; 

USCITA

База данни грешка. 

INPUT

json_encode($text); 

USCITA

"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430." 

risposta

180

Da PHP/5.4.0, è disponibile un'opzione "JSON_UNESCAPED_UNICODE". Check it out:

http://se2.php.net/json_encode

Pertanto si dovrebbe cercare:

json_encode($text, JSON_UNESCAPED_UNICODE); 
+2

Aha. Grazie! Avrei dovuto leggere la documentazione con più attenzione. Grazie. –

+2

Mi chiedo se esiste un modo per impostarlo come predefinito. –

+3

JSON_UNESCAPED_UNICODE è stato introdotto in PHP 5.4.0 e non è disponibile nelle versioni precedenti. Quando lo si utilizza nelle versioni precedenti si otterrà questo errore: "Attenzione: json_encode() si aspetta che il parametro 2 sia lungo, stringa data in ...". Vedere la risposta di CertaiN sotto per la soluzione 5.3. –

47

JSON_UNESCAPED_UNICODE è disponibile su PHP versione 5.4 o successiva.
Il seguente codice è per la versione 5.3.

AGGIORNATO

  • html_entity_decode è un po 'più efficiente di pack + mb_convert_encoding.
  • (*SKIP)(*FAIL) salta le barre rovesciate e i caratteri specificati con le flag JSON_HEX_*.

 

function raw_json_encode($input, $flags = 0) { 
    $fails = implode('|', array_filter(array(
     '\\\\', 
     $flags & JSON_HEX_TAG ? 'u003[CE]' : '', 
     $flags & JSON_HEX_AMP ? 'u0026' : '', 
     $flags & JSON_HEX_APOS ? 'u0027' : '', 
     $flags & JSON_HEX_QUOT ? 'u0022' : '', 
    ))); 
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/"; 
    $callback = function ($m) { 
     return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8'); 
    }; 
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags)); 
} 
+1

Non dovresti \ u i.e. maiuscolo? – malhal

+3

Bella soluzione per PHP <5.4;) – qdev

+0

Cercavo 3 giorni per trovare questa soluzione per la versione 5.3 poiché il mio host non ha aggiornato a 5.4. Per me sei un risparmiatore di vita e per essere così completo preferirei segnarlo come risposta accettata! – Laci

-1

Dal momento che si chiede:

Is there any way to convert the output to UTF-8 characters?

Un'altra soluzione è quella di utilizzare utf8_encode.

Codifica la stringa in UTF-8.

ad es.

foreach ($rows as $key => $row) { 
    $rows[$key]["keyword"] = utf8_encode($row["keyword"]); 
} 

echo json_encode($rows); 
+0

Non usare questo. Come indicato nella pagina del documento PHP, utf8_encode è appropriato solo se la tua stringa originale è codificata ISO-8859-1 (Latin1). Non è una funzione "assicurarsi che questa stringa sia codificata utf-8". – telomere

Problemi correlati