Configuración de información charset en .htaccess

Pregunta

¿Cómo utilizo las directivas de .htaccess en un servidor Apache para ejecutar archivos con una codificación específica?

Información preliminar

Es importante asegurarse de que toda información sobre la codificación de caracteres enviada por el servidor sea correcta, dado que la información incluida en el encabezado HTTP anula la información que contiene el documento mismo.

Numerosos servidores Apache están configurados para enviar archivos utilizando la codificación ISO-8859-1 (Latin-1). En los ejemplos mencionados en estas preguntas frecuentes, vamos a suponer que usted desea ejecutar el(los) archivo(s) utilizando una codificación diferente a la especificada en la configuración predeterminada. (Para obtener orientación acerca de cómo elegir una codificación, consulte el tutorial Choosing & applying a character encoding).

A continuación, se muestra un ejemplo de un encabezado HTTP que acompaña a un archivo enviado por un agente de usuario. En este caso, la información sobre la codificación de caracteres se incluye en el encabezado Content-Type que aparece en la segunda línea desde la parte inferior.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
Content-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

En el ejemplo, el encabezado Content-Type expresa tanto el tipo MIME del archivo como la codificación de caracteres. El tipo MIME describe el formato del archivo que está ejecutando. Los archivos HTML generalmente se ejecutan como text/html. La codificación de caracteres (o 'charset') de este archivo es UTF-8.

Para saber cómo visualizar el encabezado HTTP para un archivo, consulte el artículo Verificación de los encabezados HTTP.

Los archivos en el servidor Apache puede ejecutarse con una declaración predeterminada de codificación de caracteres en el encabezado HTTP que sea opuesta a la codificación real del archivo. Es posible que la codificación de caracteres enviada por el servidor sea la configuración predeterminada disponible para su uso inmediato, una configuración predeterminada establecida por el administrador del sistema o derivada de la implementación de varias directivas de Apache. En otros casos, el servidor no envía ninguna información de codificación de caracteres cuando realmente se la desea obtener.

Si el servidor se configura para permitirles a los usuarios o a los administradores cambiar la información en los archivos .htaccess, éstos pueden proporcionar una forma de anular las configuraciones predeterminadas. Estas preguntas frecuentes le muestran cómo hacerlo.

Respuesta

Hay un par de escenarios distintos que deben tenerse en cuenta. En primer lugar, es posible que quiera cambiar la opción predeterminada para todos los archivos de un directorio con la misma extensión. De manera alternativa, puede que quiera cambiar la opción predeterminada para un solo archivo o para una pequeña cantidad de archivos. Analizaremos tales escenarios de a uno por vez.

En nuestros ejemplos, asumiremos que la configuración predeterminada del servidor ejecuta archivos como ISO-8859-1, pero que usted desea ejecutar su(s) archivo(s) utilizando UTF-8 (¡una estrategia muy sensata!).

¿Esta respuesta es pertinente para usted?

Este artículo está escrito por autores de contenido y no por administradores de sistemas. Configurar la codificación predeterminada del servidor es una cuestión que excede el alcance de dicho artículo.

Este consejo sólo es pertinente si usted está de acuerdo con el hecho de declarar la codificación de caracteres de su documento mediante el encabezado HTTP. En algunos casos, es posible que no desee hacerlo.

Tenga en cuenta que estas preguntas frecuentes también dan por sentado que su servidor está configurado para utilizar archivos .htaccess, y que las directivas descritas a continuación funcionan en los archivos .htaccess de su servidor. También se da por sentado que no es correcto simplemente cambiar la configuración predeterminada del servidor. Si no está seguro, contáctese con el administrador de su servidor.

También debe tener en cuenta las convenciones en uso sobre su servidor respecto de la asociación de la información de codificación de caracteres a las extensiones. En algunos casos, el servidor puede estar configurado con la expectativa de que las codificaciones de caracteres se indiquen mediante extensiones específicas de codificación, por ejemplo, example.html.utf8, donde .utf8 es lo que debe estar asociado a la codificación de caracteres, y no .html (que puede estar asociado al tipo de archivo).

Si estos enfoques no son suficientes, deberá remitirse a los manuales de Apache (consulte los enlaces) o al administrador de su servidor.

Especificación por extensión

Utilice la directiva AddCharset para asociar la codificación de caracteres a todos los archivos que tienen una extensión en particular en el directorio actual y sus subdirectorios. Por ejemplo, para ejecutar todos los archivos con la extensión .html como UTF-8, abra el archivo .htaccess en un editor de texto plano e ingrese la siguiente línea:

AddCharset UTF-8 .html

La extensión puede especificarse con o sin el punto inicial. Puede agregar extensiones múltiples a la misma línea. Esto funcionará incluso si tiene nombres de archivos como example.en.html o example.html.en.

El ejemplo hará que todos los archivos con la extensión .html se ejecuten como UTF-8. El encabezado Content-Type de HTTP contendrá una línea que finaliza con la información 'charset', como se muestra en el ejemplo que sigue.

Content-Type: text/html; charset=UTF-8

Nota: todos los archivos con esta extensión en todos los subdirectorios de la ubicación actual también se ejecutarán como UTF-8. Si por alguna razón usted necesitara ejecutar el archivo dispar con una codificación distinta, deberá anular esto mediante las otras directivas.

Nota: puede asociar la codificación de caracteres a cualquier extensión que se adjunte a su archivo. Por ejemplo, supongamos que usted efectúa la negociación de idioma y que tiene páginas en dos idiomas que siguen el modelo example.en.html y example.ja.html. También supongamos que está de acuerdo con el hecho de ejecutar páginas en inglés mediante la opción predeterminada ISO-8859-1 de su servidor, pero desea ejecutar archivos en japonés en UTF-8. Para hacerlo, puede asociar la codificación de caracteres a la extensión del idioma, como se muestra a continuación:

AddCharset UTF-8 .ja

Sin embargo, tenga en cuenta que, en caso de que pueda, el hecho de cambiar la opción predeterminada del servidor por UTF-8 o de ejecutar todos los archivos en directorios nuevos como UTF-8 podría ser una mejor solución.

Nota: también es posible obtener el mismo resultado mediante la directiva AddType, aunque esto declara la codificación de caracteres y el tipo MIME al mismo tiempo. La decisión acerca de qué es lo más adecuado dependerá, en parte, de cómo esté utilizando las extensiones para la negociación de contenido. Si utiliza diferentes extensiones para expresar el tipo de documento y la codificación de caracteres, es menos probable que esto sea adecuado.

AddType 'text/html; charset=UTF-8' html

Cambio del archivo ocasional

Vamos a suponer que usted desea ejecutar sólo un archivo como UTF-8 en un directorio grande, donde los demás archivos más antiguos se ejecutan correctamente como ISO-8859-1. El archivo que desea ejecutar como UTF-8 se denomina example.html. Abra el archivo .htaccess en un editor de texto plano e ingrese lo siguiente:

<Files "example.html">
AddCharset UTF-8 .html
</Files>

Lo que hicimos aquí fue englobar la directiva analizada en la sección anterior en alguna etiqueta que identifique el archivo específico que nos ocupa. Si lo necesita, también existe una sintaxis ligeramente distinta que le permite especificar una serie de nombres de archivos mediante una expresión regular.

Nota: también es posible obtener el mismo resultado mediante la directiva AddType que se muestra más arriba o, en este caso, la directiva ForceType, aunque esto declara la codificación de caracteres y el tipo MIME al mismo tiempo.

<Files "example.html">
ForceType 'text/html; charset=UTF-8'
</Files>

Nota: los archivos que tengan el mismo nombre en un subdirectorio de la ubicación actual también serán ejecutados como UTF-8, a menos que cree una directiva contraria en el directorio pertinente.

Escenarios más complejos

Cuando se aplican dos reglas de extensión al mismo documento, el orden de las extensiones es importante. Por lo tanto, en el siguiente ejemplo:

AddCharset UTF-8 .utf8
AddCharset windows-1252 .html

el archivo 'example.utf8.html' se ejecutará como"windows-1252" y el 'example.html.utf8' como UTF-8.