Este artículo explica cómo modificar el conjunto de caracteres utilizado para determinados tipos de archivo (de acuerdo a la extensión) en las respuestas a peticiones de servidor Web Apache, mediante un archivo de configuración .htaccess.



Es importante que el conjunto de caracteres utilizado por un servidor Web en sus respuestas sea correcto, ya que la información en los headers HTTP tiene prioridad sobre la información de codificación contenida dentro de los archivos en sí mismos. Si el conjunto de caracteres en la respuesta es incorrecto (diferente al utilizado por el archivo que se está sirviendo), es cuando aparecen los clásicos errores de codificación de caracteres (particularmente con tildes y caracteres especiales):

Algunos servidores Apache están configurados para responder peticiones (enviar archivos) utilizando la codificación ISO-8859-1 (latin1). Entonces, si se sirven archivos con otra codificación (UTF-8 u otra) es necesario hacer algo al respecto.

Por ejemplo, el siguiente servidor Web indica (a través de los headers HTTP de la respuesta) la codificación ISO-8859-1 al servir el archivo "doc.txt", el cual se encuentra dentro del directorio "downloads" del sitio "linuxito.com":

emi@hal9000:~ % nc -vv linuxito.com 80
Connection to linuxito.com 80 port [tcp/http] succeeded!
GET /downloads/doc.txt HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 14 Jul 2015 16:30:08 GMT
Server: Apache
Last-Modified: Wed, 01 Jul 2015 14:46:34 GMT
ETag: "3a1e21-1658-519d163abb8c0"
Accept-Ranges: bytes
Content-Length: 5720
Connection: close
Content-Type: text/plain; charset=ISO-8859-1

Pero este archivo está codificado utilizando el conjunto de caracteres UTF-8 y contiene caracteres con tildes. Por lo tanto la visualización en un navegador es algo así:


ARQUITECTURA DE COMPUTADORAS
Visión general de tecnologías de cache y procesadores modernos

[...]

Esto se debe a que el archivo está codificado como UTF-8, pero el servidor Web claramente indica en la cabecera "Content-Type" de la respuesta que se debe interpretar utilizando la codificación de caracteres ISO-8859-1.

¿Cómo corregir este problema?

En servidores Apache, la codificación de caracteres puede ser establecida a nivel servidor, VirtualHost o directorio utilizando la directiva AddCharset, la cual requiere una o varias extensiones de archivo sobre la cual aplica.

Pero también es posible cambiar la codificación de caracteres utilizando un archivo de configuración .htaccess sobre un directorio en particular.

Entonces, si quisiésemos que sólo los archivos de texto (cuya extensión es .txt) dentro del directorio "/downloads" sean servidos utilizando la codificación UTF-8, se debe crear el archivo "/downloads/.htaccess" con el siguiente contenido:

AddCharset UTF-8 .txt

La siguiente vez que se acceda al archivo "/downloads/doc.txt", la codificación enviada por el servidor Apache será la correcta (UTF-8):

emi@hal9000:~ % nc -vv linuxito.com 80
Connection to linuxito.com 80 port [tcp/http] succeeded!
GET /downloads/doc.txt HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 14 Jul 2015 16:39:53 GMT
Server: Apache
Last-Modified: Wed, 01 Jul 2015 14:46:34 GMT
ETag: "3a1e21-1658-519d163abb8c0"
Accept-Ranges: bytes
Content-Length: 5720
Connection: close
Content-Type: text/plain; charset=utf-8

Se observa ahora que la cabecera "Content-Type" especifica el charset UTF-8. De esta forma, será visualizado correctamente en los navegadores:


ARQUITECTURA DE COMPUTADORAS
Visión general de tecnologías de cache y procesadores modernos

[...]

De la misma forma se pueden configurar otros conjuntos de caracteres para diferentes tipos de archivos (ver la documentación oficial al respecto).

Cuando se sirven archivos de texto plano o HTML, se debe verificar que la codificación enviada por el servidor Web en la respuesta coincida con la codificación de caracteres del archivo. Sin embargo, cuando se utilizan bases de datos, y la información presentada por un archivo fue previamente recuperada desde una tabla, es importante que no sólo la codificación de la respuesta HTTP coincida con la codificación del archivo origen; además debe coincidir la codificación que utiliza la tabla (o columna) involucrada en el resultado.

Cabe destacar que actualmente la codificación UTF-8 es la más utilizada, y es considerada casi un estándar de Internet, por lo tanto es buena idea utilizar UTF-8 por defecto en todos los archivos, tablas de bases de datos y servicios Web.

Referencias

Apache Tutorial: .htaccess files

AddCharset Directive


Tal vez pueda interesarte


Compartí este artículo