Desajuste de codificación de personajes
-
02-10-2019 - |
Pregunta
Mis guiones definitivamente se guardan en UTF-8. Estoy instanciando PDO con "{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8"
. Mis tablas usan innodb y se recopilan usando UTF8_General_CI. Mis páginas se envían con el Content-Type: text/html; charset=UTF-8
encabezado o el <meta>
equivalente.
Cuando se usa PDO para almacenar un carácter € que se origina desde la entrada HTTP o de una cadena literal en el código fuente, me queda c3 a2 e2 80 9a c2 ac
Según MySQL Workbench 5.2. Recuperar esto de la base de datos y mostrarlo en la página funciona bien. Sin embargo, en Phpmyadmin y Workbench, veo €
.
Al usar estas dos herramientas para almacenar un €, me queda e2 82 ac
, que aparentemente es la representación correcta de UTF-8, pero si intento recuperar y luego lo saco con PHP, se muestra.
Mi pregunta es, ¿desde dónde surge esta discrepancia y es posible que mis páginas web y mis herramientas de base de datos funcionen sin problemas?
Solución
La directiva Charset en el DSN en realidad se aplica a MSSQL. Simplemente necesitaba ejecutar SET NAMES
. Lo lamento.
Lo logré así:
parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
$this->user, $this->password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
Otros consejos
Simplemente, convierta € a una entidad HTML € para el superfix (pero puede obtener el problema con otros caracteres especiales)
El otro lado del problema (y más específicamente) es verificar el mysql caracteres_set_server y la causa más común caracteres_set_client - ver también: charsets de conexión
Además, es importante tener en cuenta que el meta equiv no hace ninguna diferencia, necesitas que siempre Establezca el encabezado ('Content-Type: ...)
Dado que su página HTML es correcta, parece que está almacenando los datos correctos en la base de datos.
€
es la codificación UTF-8 del signo del euro malinterpretado como Windows-1252. Parece que sus herramientas de Windows utilizan la codificación "ANSI" en lugar de la codificación de la base de datos.