Almacenamiento de datos :
-
Especifique el
utf8mb4
conjunto de caracteres en todas las tablas y columnas de texto en su base de datos. Esto hace que MySQL almacene y recupere físicamente valores codificados de forma nativa en UTF-8. Tenga en cuenta que MySQL usará implícitamenteutf8mb4
codificación si unutf8mb4_*
se especifica la intercalación (sin ningún juego de caracteres explícito). -
En versiones anteriores de MySQL (<5.5.3), lamentablemente se verá obligado a usar simplemente
utf8
, que solo admite un subconjunto de caracteres Unicode. Desearía estar bromeando.
Acceso a datos :
-
En el código de su aplicación (por ejemplo, PHP), en cualquier método de acceso a la base de datos que utilice, deberá configurar el juego de caracteres de conexión en
utf8mb4
. De esta forma, MySQL no convierte su UTF-8 nativo cuando transfiere datos a su aplicación y viceversa. -
Algunos controladores proporcionan su propio mecanismo para configurar el conjunto de caracteres de la conexión, que actualiza su propio estado interno e informa a MySQL sobre la codificación que se utilizará en la conexión; este suele ser el enfoque preferido. En PHP:
-
Si está utilizando la capa de abstracción PDO con PHP ⥠5.3.6, puede especificar
charset
en el DSN:$dbh = new PDO('mysql:charset=utf8mb4');
-
Si está utilizando mysqli, puede llamar a
set_charset()
:$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Si está atascado con mysql simple pero está ejecutando PHP ⥠5.2.3, puede llamar a
mysql_set_charset
.
-
-
Si el controlador no proporciona su propio mecanismo para configurar el conjunto de caracteres de la conexión, es posible que deba emitir una consulta para decirle a MySQL cómo su aplicación espera que se codifiquen los datos de la conexión:
SET NAMES 'utf8mb4'
. -
La misma consideración con respecto a
utf8mb4
/utf8
se aplica como arriba.
Salida :
- UTF-8 debe establecerse en el encabezado HTTP, como
Content-Type: text/html; charset=utf-8
. Puede lograrlo configurandodefault_charset
en php.ini (preferido), o manualmente usandoheader()
función. - Si su aplicación transmite texto a otros sistemas, también deberán ser informados de la codificación de caracteres. Con las aplicaciones web, el navegador debe estar informado de la codificación en la que se envían los datos (a través de encabezados de respuesta HTTP o metadatos HTML).
- Al codificar la salida usando
json_encode()
, agregaJSON_UNESCAPED_UNICODE
como segundo parámetro.
Entrada :
- Los navegadores enviarán datos en el conjunto de caracteres especificado para el documento, por lo tanto, no se debe hacer nada en particular en la entrada.
- En caso de que tenga dudas sobre la codificación de la solicitud (en caso de que se pueda alterar), puede verificar que cada cadena recibida sea UTF-8 válida antes de intentar almacenarla o usarla en cualquier lugar. PHP
mb_check_encoding()
hace el truco, pero tienes que usarlo religiosamente. Realmente no hay forma de evitar esto, ya que los clientes malintencionados pueden enviar datos en la codificación que deseen, y no he encontrado ningún truco para que PHP lo haga por usted de manera confiable.
Otras consideraciones sobre el código :
-
Obviamente, todos los archivos que servirá (PHP, HTML, JavaScript, etc.) deben estar codificados en UTF-8 válido.
-
Debe asegurarse de que cada vez que procese una cadena UTF-8, lo haga de manera segura. Esta es, desafortunadamente, la parte difícil. Probablemente querrá hacer un uso extensivo del
mbstring
de PHP extensión. -
Las operaciones de cadenas integradas de PHP no por defecto UTF-8 seguro. Hay algunas cosas que puede hacer con seguridad con las operaciones normales de cadenas de PHP (como la concatenación), pero para la mayoría de las cosas debe usar el equivalente
mbstring
función. -
Para saber lo que está haciendo (léase:no estropearlo), realmente necesita conocer UTF-8 y cómo funciona en el nivel más bajo posible. Consulte cualquiera de los enlaces de utf8.com para obtener buenos recursos para aprender todo lo que necesita saber.
Además de configurar default_charset
en php.ini, puede enviar el juego de caracteres correcto usando header()
desde dentro de su código, antes de cualquier salida:
header('Content-Type: text/html; charset=utf-8');
Trabajar con Unicode en PHP es fácil siempre que se dé cuenta de que la mayoría de las funciones de cadena no funcionan con Unicode, y algunas pueden alterar las cadenas por completo . PHP considera que los "caracteres" tienen 1 byte de longitud. A veces esto está bien (por ejemplo, explotar() solo busca una secuencia de bytes y la usa como separador, por lo que no importa qué caracteres reales busque). Pero otras veces, cuando la función está realmente diseñada para funcionar en personajes , PHP no tiene idea de que su texto tiene caracteres de varios bytes que se encuentran con Unicode.
Una buena biblioteca para consultar es phputf8. Esto reescribe todas las funciones "malas" para que pueda trabajar con seguridad en cadenas UTF8. Hay extensiones como la extensión mb_string que también intentan hacer esto por usted, pero prefiero usar la biblioteca porque es más portátil (pero escribo productos para el mercado masivo, así que eso es importante para mí). Pero phputf8 puede usar mb_string detrás de escena, de todos modos, para aumentar el rendimiento.
Me gustaría agregar una cosa a la excelente respuesta de chazomaticus:
Tampoco olvides la etiqueta META (como esta, o la versión HTML4 o XHTML):
<meta charset="utf-8">
Eso parece trivial, pero IE7 me ha dado problemas con eso antes.
Estaba haciendo todo bien; la base de datos, la conexión de la base de datos y el encabezado HTTP de tipo de contenido se configuraron en UTF-8 y funcionó bien en todos los demás navegadores, pero Internet Explorer aún insistía en usar la codificación "Europa occidental".
Resultó que a la página le faltaba la etiqueta META. Agregar eso resolvió el problema.
Editar:
El W3C en realidad tiene una sección bastante grande dedicada a I18N. Tienen una serie de artículos relacionados con este problema, que describen el lado HTTP, (X)HTML y CSS:
- Preguntas frecuentes:Cambiar la codificación de la página (X)HTML a UTF-8
- Declaración de codificaciones de caracteres en HTML
- Tutorial:conjuntos de caracteres y codificaciones en XHTML, HTML y CSS
- Configuración del parámetro de juego de caracteres HTTP
Recomiendan usar tanto el encabezado HTTP como la metaetiqueta HTML (o la declaración XML en el caso de XHTML servido como XML).