Foros del Web » Programando para Internet » PHP »

Codificación acentos Json y PHP

Estas en el tema de Codificación acentos Json y PHP en el foro de PHP en Foros del Web. Hola, buenas! quisiera comentarles un problema que estoy sufriendo. Tengo una base de datos MySql con una tabla y un archivo PHP que realiza una ...
  #1 (permalink)  
Antiguo 01/05/2012, 04:48
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Codificación acentos Json y PHP

Hola, buenas! quisiera comentarles un problema que estoy sufriendo.
Tengo una base de datos MySql con una tabla y un archivo PHP que realiza una consulta.
En la tabla,tengo tres registros, y uno de ellos con acento.El problema es que cuando ejecuto el php me muestra lo siguiente:

Código PHP:
Ver original
  1. [{"nombre":null},{"nombre":"Benimodo"},{"nombre":"Carlet"}]

Éste es el código del archivo php:


Código PHP:
Ver original
  1. <?php
  2.  
  3. //Credenciales de la BBDD
  4. $db = "farmacias";
  5. $host = 'localhost';
  6. $username = "dpbataller";
  7. $password = '1234';
  8.  
  9. //Conectamos al servidor de la Base de datos
  10. $link = mysql_connect($host,$username,$password) or die("No se puede conectar");
  11. //Seleccionamos la BBDD
  12. @mysql_select_db($db) or die ("No se ha podido seleccionar a la base de datos");
  13.  
  14. //Creamos un array para almacenar los resultados
  15. $arr = array();
  16. //Lanzamos la consulta
  17. $consulta = mysql_query('SELECT nombre FROM poblacion ORDER BY nombre ASC');
  18.  
  19. //Agregamos las filas devueltas al array
  20. while ($obj = mysql_fetch_object($consulta)) {
  21.    
  22.     $arr[] = $obj; 
  23. }
  24. //Devolvemos el resultado
  25. echo json_encode($arr);
  26. //Cerramos la BBDD
  27.  
  28. ?>

Cómo podeis ver, el primer registro sale NULL, y es ese el que tiene el acento!
Qué puedo hacer?
La base de datos y las tablas tienen utf-8_general_ci cómo codificacion
Estoy volviéndome locooo!

Ayuda, plis!
  #2 (permalink)  
Antiguo 01/05/2012, 05:24
Avatar de santris  
Fecha de Ingreso: agosto-2009
Ubicación: Sant Feliu de Llobregat
Mensajes: 955
Antigüedad: 14 años, 8 meses
Puntos: 66
Respuesta: Codificación acentos Json y PHP

El valor en la tabla está codificado en utf-8, lo has comprobado?

saludos,
__________________
Tu álbum de cromos online!!
  #3 (permalink)  
Antiguo 01/05/2012, 07:09
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

Te comento, las tablas al igual que la base de datos, tienen utf-8_spanish_ci cómo codificación. Debería ser utf-8 a secas?
El valor lo inserto desde phpmyadmin haciendo un:
insert into poblacion (cp,nombre,provincia) values ('46680','Algemesí','Valecia');
Al igual que lo los demás valores, lo unico es que el único valor que devuelve vacío el
Archivo php es el de Algemesí ( tiene acento) ¿Qué puede estar pasando?
El error será del json_encode?
No sé por que falla...
  #4 (permalink)  
Antiguo 01/05/2012, 10:38
Avatar de santris  
Fecha de Ingreso: agosto-2009
Ubicación: Sant Feliu de Llobregat
Mensajes: 955
Antigüedad: 14 años, 8 meses
Puntos: 66
Respuesta: Codificación acentos Json y PHP

Cita:
Iniciado por dpbataller Ver Mensaje
Te comento, las tablas al igual que la base de datos, tienen utf-8_spanish_ci cómo codificación. Debería ser utf-8 a secas?
Esta función solo funciona con datos utf-8, debes mirar el registro para ver si realmente 'Algemesí' tiene este aspecto: 'AlgemesÃ'
__________________
Tu álbum de cromos online!!
  #5 (permalink)  
Antiguo 02/05/2012, 04:25
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

Hola de nuevo. He cambiado el código y la base de datos.
Os vuelvo a exponer la situacion:

Formulario para insertar registros en HTML:


Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.  
  3. <html lang="es">
  4.  
  5.     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  6. </head>
  7.  
  8.  
  9.  
  10.     <form id="formulario" name="formulario" method="post" action="insertar_persona.php" enctype="multipart/form-data"> 
  11.         <p>Nombre:</p>
  12.         <input type="text" name="nombre" value="nombre" />     
  13.         <br/><br/>
  14.         <input type="submit" id="insertar" name="insertar" value="Insertar"/>
  15.    
  16.     </form>
  17.    
  18. </body>
  19.  
  20. </html>

Código PHP para realizar la inserción de los registros


Código PHP:
Ver original
  1. <?php
  2. header ('Content-type: text/html; charset=utf-8');
  3. //Credenciales de la BBDD
  4. $db = "prueba";
  5. $host = 'localhost';
  6. $username = "dpbataller";
  7. $password = '1234';
  8.  
  9. //Conectamos al servidor de la Base de datos
  10. $link = mysql_connect($host,$username,$password) or die("No se puede conectar");
  11. //Seleccionamos la BBDD
  12. @mysql_select_db($db) or die ("No se ha podido seleccionar a la base de datos");
  13.  
  14. //Lanzamos la consulta
  15. $consulta = mysql_query("INSERT INTO personas (id,nombre) VALUES ('','$_POST[nombre]')");
  16.  
  17. ?>


Código PHP para devolver los registros en formato Json

Código PHP:
Ver original
  1. <?php
  2. header ('Content-type: text/html; charset=utf-8');
  3. //Credenciales de la BBDD
  4. $db = "prueba";
  5. $host = 'localhost';
  6. $username = "dpbataller";
  7. $password = '1234';
  8.  
  9. //Conectamos al servidor de la Base de datos
  10. $link = mysql_connect($host,$username,$password) or die("No se puede conectar");
  11. //Seleccionamos la BBDD
  12. mysql_select_db($db) or die ("No se ha podido seleccionar a la base de datos");
  13.  
  14. //Lanzamos la consulta
  15. $consulta = mysql_query("SELECT id,nombre from personas");
  16. //Creamos un array para almacenar los resultados
  17. $filas = array();
  18.  
  19. //Agregamos las filas devueltas al array
  20. while ($r = mysql_fetch_assoc($consulta)) {
  21.    
  22.     $filas[] = $r; 
  23.    
  24. }
  25. //Devolvemos el resultado
  26. echo json_encode($filas);
  27.  
  28. ?>

La situación es la siguiente, inserto nombres con acentos, por ejemplo, José.
Voy a la BD y miro que se ha guardado José, y el archivo Json me devuelte
Código Javascript:
Ver original
  1. [{"id":"1","nombre":"Jos\u00c3\u00a9"}

Tanto la BD cómo las tablas tienen la codificación utf8_spanish2_ci

¿Qué está pasando? me vuelvo loco..
  #6 (permalink)  
Antiguo 02/05/2012, 09:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Codificación acentos Json y PHP

También tienes que establecer que la conexión sea UTF-8:
Código PHP:
Ver original
  1. mysql_set_charset('utf8', $link);

También asegúrate que tu script este guardado como UTF-8 sin BOM.

Saludos.
  #7 (permalink)  
Antiguo 03/05/2012, 01:53
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

Siento ser pesado en éste tema, chicos peros sois los únicos que podéis ayudarme.
Sigue sin funcionar, he probado lo que me has dicho GatorV, pero sigue saliendo igual.
Vuelvo a pegar el código para que sea más cómodo seguir la problemática

//index.html

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.  
  3. <html lang="es">
  4.  
  5.     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  6. </head>
  7.     <form id="formulario" name="formulario" method="post" action="insertar_persona.php" enctype="multipart/form-data"> 
  8.         <p>Nombre:</p>
  9.         <input type="text" name="nombre" value="nombre" />     
  10.         <br/><br/>
  11.         <input type="submit" id="insertar" name="insertar" value="Insertar"/>
  12.    
  13.     </form>
  14.    
  15. </body>
  16.  
  17. </html>

//insertar_persona.php

Código PHP:
Ver original
  1. <?php
  2. header ('Content-type: text/html; charset=utf-8');
  3. //Credenciales de la BBDD
  4. $db = "prueba";
  5. $host = 'localhost';
  6. $username = "dpbataller";
  7. $password = '1234';
  8.  
  9. //Conectamos al servidor de la Base de datos
  10. $link = mysql_connect($host,$username,$password) or die("No se puede conectar");
  11.  
  12. //Seleccionamos la BBDD
  13. mysql_select_db($db) or die ("No se ha podido seleccionar a la base de datos");
  14. mysql_set_charset('utf8', $link);
  15. //Lanzamos la consulta
  16. $consulta = mysql_query("INSERT INTO personas (id,nombre) VALUES ('','$_POST[nombre]')");
  17.  
  18. ?>


mostrar_persona.php

Código PHP:
Ver original
  1. <?php
  2. header("Content-Type: text/html; charset=UTF-8");
  3. //Credenciales de la BBDD
  4. $db = "prueba";
  5. $host = 'localhost';
  6. $username = "dpbataller";
  7. $password = '1234';
  8.  
  9. //Conectamos al servidor de la Base de datos
  10. $link = mysql_connect($host,$username,$password) or die("No se puede conectar");
  11. //Seleccionamos la BBDD
  12. mysql_select_db($db) or die ("No se ha podido seleccionar a la base de datos");
  13. mysql_set_charset('utf8', $link);
  14. //Lanzamos la consulta
  15. $consulta = mysql_query("SELECT id,nombre from personas");
  16. //Creamos un array para almacenar los resultados
  17.  
  18. $filas = array();
  19.  
  20. //Agregamos las filas devueltas al array
  21. while ($r = mysql_fetch_assoc($consulta)) {
  22.    
  23.     $filas[] = $r; 
  24.    
  25. }
  26.  
  27. //Devolvemos el resultado
  28. echo json_encode($filas);
  29.  
  30. ?>

Los registros que he insertado desde el index.html son:
José <-- LLeva acento
Miguel
David

En la tabla de la base de datos,aparecen bien, José con acentos y los demás normal, pero al ejecutar el script mostrar_personas.php muestra lo mismo de antes

[{"id":"1","nombre":"Jos\u00e9"},{"id":"2","nombre" :"Miguel"},{"id":"3","nombre":"David"}]

Tengo un problema de codificación y no consigo resolverlo
Gracias por la paciencia, de verdad.
  #8 (permalink)  
Antiguo 03/05/2012, 11:26
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

He intentado asegurarme de guardar los archivos en utf-8 sin bom cómo he visto en otros foros y tampco.
Alguien podría probarlo en su Pc y comentarme que tal? Es bastante necesario conseguirlo y no doy con la solución.
Gracias
  #9 (permalink)  
Antiguo 03/05/2012, 11:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Codificación acentos Json y PHP

De hecho así es lo correcto, mira este script, ambos estan guardados como UTF8 sin BOM (usando Notepad++):
Código PHP:
Ver original
  1. <?php
  2. $registros = array(
  3.     array(
  4.         'name' => 'José',
  5.         'pais' => 'Colombia'
  6.     ),
  7.     array(
  8.         'name' => 'Juan',
  9.         'pais' => 'México',
  10.     ),
  11.     array(
  12.         'name' => 'Pedro',
  13.         'pais' => 'USA'
  14.     )
  15. );
  16.  
  17. header('Content-type: text/json');
  18. echo json_encode($registros);

Código HTML:
Ver original
  1.     <head>
  2.         <title>Test</title>
  3.         <script src="http://code.jquery.com/jquery-1.7.2.min.js" type="text/javascript"></script>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5.     </head>
  6.     <body>
  7.         <div id="result"></div>
  8.     </body>
  9.     <script type="text/javascript">
  10.         jQuery(document).ready(function() {
  11.             jQuery.getJSON('json.php', function(response) {
  12.                 jQuery.each(response, function(i, result) {
  13.                     jQuery('#result').append('<p>' + result.name + ' => ' + result.pais + '</p>');
  14.                 });
  15.             });
  16.         });
  17.     </script>
  18. </html>
  #10 (permalink)  
Antiguo 03/05/2012, 12:53
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

Hola de nuevo GatorV, y gracias por contestar.
He copiado el script y me muestra lo siguiente:

Parse error: syntax error, unexpected T_STRING, expecting ')' in /Applications/XAMPP/xamppfiles/htdocs/json/json.php on line 3

El código está correcto, no? Tú lo has probado? ¿El header debe ir al final o es mejor al principio?

Última edición por dpbataller; 03/05/2012 a las 13:00
  #11 (permalink)  
Antiguo 03/05/2012, 13:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Codificación acentos Json y PHP

Sí, yo lo probé y funciona correctamente en mi maquina, tal cual esta aquí...
  #12 (permalink)  
Antiguo 03/05/2012, 13:37
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

No me queda más que pensar que el problema sea de mi máquina???
Estoy usando un MacBook...
Voy a problarlo en un Windows y te cuento.
  #13 (permalink)  
Antiguo 03/05/2012, 14:38
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

Nada, no funciona, en la máquina Windows, usando notepad++, diciendo que lo codifique en UTF-8 sin BOM tampoco funciona.
Salen los acentos con este formato: Jos\u00e9

Significa esto que no voy a poder solucionarlo?...
  #14 (permalink)  
Antiguo 03/05/2012, 16:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Codificación acentos Json y PHP

Es lo que te digo, Jos\u00e9 es correcto, esta codificado como UTF-8, por eso al desplegarlo se ve ya correctamente, ejecuta el script que te pase, y aunque veas el JSON en la respuesta así, ya al imprimirlo en tu pagina web se ve correcto.

Saludos.
  #15 (permalink)  
Antiguo 04/05/2012, 03:05
 
Fecha de Ingreso: agosto-2009
Mensajes: 134
Antigüedad: 14 años, 8 meses
Puntos: 3
Respuesta: Codificación acentos Json y PHP

Esta tarde lo pruebo y te comento, Gracias
  #16 (permalink)  
Antiguo 10/07/2012, 23:03
Avatar de mariapao  
Fecha de Ingreso: noviembre-2008
Mensajes: 3
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Codificación acentos Json y PHP

Amigo el problema está en la codificación:

Antes de usar json_encode(), te recomiendo que las variables las pases a UTF-8 con utf8_encode().

Ejemplo: $jsondata['nombres'] = utf8_encode($POST['nombres']);

Te recomiendo que el charset o cotejamiento de tu base de datos se encuentre en latin1_general_ci que es el que me ha servido con los caracteres especiales.

Cuando vayas a hacer la inserción en la base de datos, utiliza en tus variables la función utf8_decode().

Ejemplo: $Resultado = mysql_query(sprintf("INSERT INTO persona VALUES('%s')", utf8_decode($_POST['nombres'])), $conexion) or die(mysql_error());

Esa fue la solución a mi problema con acentos tanto en JSON, como para guardar los datos en mi base de datos MySQL.

Espero haberte ayudado :)

Etiquetas: acentos, json, mysql, registro, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:16.