php - multidimensional - ¿Cómo hago que MySQL devuelva UTF-8?
search array php key (2)
Estoy usando PHPUnit para validar el resultado XML de mi código PHP, pero aparentemente tengo problemas con la codificación de caracteres que devuelve MySQL . Aquí está el error que recibo de DOMDocument:
Input is not proper UTF-8, indicate encoding!
Bytes: 0xE9 0x20 0x42 0x65
Inicializo DOMDocument para que use la codificación correcta:
$domDocument = new DOMDocument(''1.0'',''UTF-8'');
Y cuando miro el resultado de saveXML () usando mb_detect_encoding, el resultado es UTF-8 .
También verifiqué todas las llamadas utilizadas para crear el XML, usando mb_detect_encoding en todos los parámetros createCDATASection encontrados y todos son UTF-8 o ASCII (no hay nodos de texto sin formato, todo está en bloques CDATA ).
Creo que el problema proviene del uso de un carácter ''é'' (que es 0xE9 en ISO 8859-1 ). La línea que agrega ese carácter a mi XML es:
$domDocument->createCDATASection($place->name);
y mb_detect_encoding ($ place-> name) me da UTF-8.
Los datos ($ place-> name) se extraen de una base de datos MySQL. Esta base de datos tiene el juego de caracteres UTF-8.
Aquí hay un código de ejemplo:
$query = sprintf(''SELECT name FROM place where id = 1'');
$result = mysql_query($query);
$result = mysql_fetch_assoc($result);
// -- Feeding UTF-8 data directly WORKS
$domDocument = new DOMDocument(''1.0'',''UTF-8'');
$rootNode = $domDocument->createElement(''Response'');
$rootNode->appendChild($domDocument->createCDATASection(''Café Belga''));
$domDocument->appendChild($rootNode);
$matcher = array(''tag'' => ''Response'');
self::assertTag($matcher, $domDocument->saveXML(), '''', FALSE);
// -- Feeding UTF-8 data from the resultset FAILS
$domDocument = new DOMDocument(''1.0'',''UTF-8'');
$rootNode = $domDocument->createElement(''Response'');
$rootNode->appendChild($domDocument->createCDATASection($result[''name'']));
$domDocument->appendChild($rootNode);
$matcher = array(''tag'' => ''Response'');
self::assertTag($matcher, $domDocument->saveXML(), '''', FALSE);
En mi depurador PHPStorm, la cadena recuperada de la base de datos se ve así:
Caf Belga
Entonces creo que esa es la raíz del problema. En MySQLWorkbench, la cadena es correcta: Café Belga.
Sin embargo, cuando se usa utf8_encode($result[''name''])
todo funciona bien.
Un cheque más en la ventana de relojes:
mb_detect_encoding($result[''name''])
-> "UTF-8"
mb_detect_encoding(utf8_encode($result[''name'']))
-> "UTF-8"
En una nota lateral, ¿hay algún sitio donde simplemente pueda copiar y pegar esos valores hexadecimales y ver qué personajes se supone que tienen en diferentes conjuntos de caracteres?
Desde la versión PHP 5.5.0 debes usar
mysqli_set_charset($connection,"utf8");
Debe definir la conexión a su base de datos como UTF-8 :
// Set up your connection
$connection = mysql_connect(''localhost'', ''user'', ''pw'');
mysql_select_db(''yourdb'', $connection);
mysql_query("SET NAMES ''utf8''", $connection);
// Now you get UTF-8 encoded stuff
$query = sprintf(''SELECT name FROM place where id = 1'');
$result = mysql_query($query, $connection);
$result = mysql_fetch_assoc($result);