Trabajando con UTF-8 en PHP, MySQL y Apache
In English  

Como ya he publicado anteriormente en este sitio web, creo que es una buena idea estandarizar en una misma codificación de caracteres a través de todas las partes de un sistema, y ya que mi codificación de caracteres preferida es UTF-8, cuando creo un sistema con PHP reviso lo siguiente:

  • Que el navegador recibe e interpreta la salida de mis scripts de PHP como UTF-8.
  • Que los formularios en (X)HTML aceptan UTF-8.
  • Que PHP trata los datos recibidos de una base de datos de MySQL como UTF-8.

Por supuesto también necesitamos ajustar nuestro editor de texto preferido para que use nuestra codificación deseada y cuando creamos tablas en MySQL elegir UTF-8 como su codificación (creare un artículo sobre las diferentes codificaciones y sobre las colaciones en el futuro).

Hacer que el navegador interprete nuestro documento como UTF-8

No siempre podemos contar con la habilidad de modificar el archivo de php.ini en nuestro servidor, pero asumiendo que podemos, en este caso ajustamos la codificación de caracteres de nuestros scripts de PHP cambiando:

default_charset = "utf-8"

Sin embargo, si esto no esta disponible, podemos especificar la codificación de caracteres en el que el archivo está siendo servido enviando una cabecera al comienzo de nuestro script::

<?php header("Content-type: text/html; charset=utf8"); ?>

Aunque hacer esto podría ser redundante, podemos especificar la codificación en una etiqueta de meta dentro de nuestro documento (X)HTML resultante:

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

Hacer que el navegador acepte UTF-8 en los formularios

Ya que estamos manejando todo como UTF-8, podemos asegurarnos de que los formularios aceptan esta codificación de caracteres agregando el atributo accept-charset a la etiqueta form:

<form accept-charset="utf-8">

Tratar los datos que obtenemos desde una base de datos MySQL como UTF-8

Debemos asegurarnos que la información que recibimos desde la base de datos esté siendo manejada como UTF-8 por nuestros scripts de PHP, para hacer esto podemos utilizar las funciones mysql_set_charset() o mysqli_set_charset():

mysql_set_charset('utf8');

Ahora todo debe mostrarse y funcionar correctamente dentro de nuestro script PHP.

UTF-8 en archivos de texto plano y archivos HTML.

Asumiendo que tenemos acceso al archivo de configuración de Apache, httpd.conf (podría estar localizado en /etc/apache2/httpd.conf, o en /etc/httpd/conf/httpd.conf), podemos agregar lo siguiente a este archivo:

AddDefaultCharset UTF-8

Pero si no podemos modificar httpd.conf, aún podemos hacerlo agregando lo mismo a nuestro archivo .htaccess

Por supuesto podemos agregar una etiqueta meta a nuestros archivos de HTML como se describió previamente, pero esta es una manera de asegurarse que nuestros archivos de texto plano son enviados como UTF-8.