2010-11-02 99 views
18

¿Cómo puedo guardar una cadena json-encoded con caracteres internacionales en el databse y luego analizar la cadena decodificada en el navegador?PHP json_encode json_decode UTF-8

<?php   
    $string = "très agréable"; 
    // to the database 
    $j_encoded = json_encode(utf8_encode($string)); 
    // get from Database 
    $j_decoded = json_decode($j_encoded); 
?>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 
    <?= $j_decoded ?> 
</html> 
+0

Más o menos la forma en que muestras. ¿Qué no funciona? –

+0

me da: très agrà© able – FFish

+0

@FFish ¿Tu archivo PHP está guardado como UTF-8? (Por lo general, hay una selección en "Guardar como ..."diálogo" es el documento que se sirve como UTF-8? Puede usar la etiqueta Meta para probar: '' –

Respuesta

18

Este es un tema de codificación. Parece que en algún momento, los datos se representan como ISO-8859-1.

Cada parte de su proceso debe estar codificada en UTF-8.

  • La conexión a la base

  • Las tablas de la base

  • su archivo PHP (si está utilizando caracteres especiales dentro de ese archivo como se muestra en el ejemplo anterior)

  • El content-type encabezados que genere

+0

Creo que esta es la mejor respuesta, ¡necesito verificar mi codificación DB! – FFish

+0

Puede agregar el código necesario para lograr todo eso. –

3
  1. utf8_decode$j_decoded = utf8_decode(json_decode($j_encoded));EDITAR o para ser más correctos $j_encoded = json_encode($j_encoded);$j_decoded = json_decode($j_encoded); hay necesidad de utf8 es/decodificación
  2. <meta charset="utf-8" />
+0

¿Por qué necesitarías 'utf8_decode()' (que se convierte en ISO-8859-1) en un entorno UTF-8? –

+0

bien, ya veo. Tengo que utf8_decode() también ... ¿Hay alguna diferencia al hacer utf8_decode (json_decode ($ j_encoded)) vs json_decode (utf8_decode ($ j_encoded))? – FFish

+0

sí lo es, y para ser correcto no debe usar 'utf8_encode' de todos modos, pero la forma en que lo usó es el poit. 1 codifica utf8 y luego json, para obtener su entrada debe decodificar json y luego utf8 – teemitzitrone

11

Si su archivo fuente ya es utf8, suelte las funciones utf8_ *. php5 está almacenando cadenas como una matriz de bytes.

debe agregar una metaetiqueta para la codificación dentro del html Y debe agregar un encabezado http que establece la transferencoding a utf-8.

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

y en php

<?php 
header('Content-Type: text/html; charset=utf-8'); 
4

Intente enviar el encabezado de juego de caracteres UTF-8:

<?php header ('Content-type: text/html; charset=utf-8'); ?> 

Y la meta HTML:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
25
header('Content-Type: application/json; charset=utf-8'); 
26

JSON codificación UTF-8 y decodificar:

json_encode($data, JSON_UNESCAPED_UNICODE) 

json_decode($json, false, 512, JSON_UNESCAPED_UNICODE) 

fuerza utf8 puede estar atento también: http://pastebin.com/2XKqYU49

+2

¿por qué dar menos? Tuve suficientes situaciones en las que esta es LA única forma en que funcionó. No me diga todo sobre la codificación de archivos, bases de datos, etc. Hay situaciones en las que no conoce la codificación de sus recursos y aparece al azar. Algunos utf8 algunos otros que puedas imaginar. –

+2

esto funcionó para mí – Muath

+1

Gracias. Esto funcionó para mí. – sj59

0

si recibe "inesperada de caracteres" error usted debe comprobar si hay una (marcador de orden de bytes de la lista de materiales guardados en su utf -8 json. Puede eliminar el primer carácter o guardarlo sin BOM.

0

trabajo para mí :)

function jsonEncodeArray($array){ 
    array_walk_recursive($array, function(&$item) { 
     $item = utf8_encode($item); 
    }); 
    return json_encode($array); 
} 
+0

Gracias, esto señaló el camino para mí, ¡excepto que al principio empeoró las cosas! :) entonces me di cuenta de que se debía a que algo obviamente había estado "sobrecodificado" en algún lugar más profundo de la pila, por lo que -quizá de forma extraña- cambiar el 'utf8_encode' por' utf8_decode' lo resolvió. – randomsock