Para respuestas HTTP con tipos de contenido que sugieren los datos de caracteres, que charset debe ser asumida por el cliente si no se especifica ninguno?

StackOverflow https://stackoverflow.com/questions/2325571

Pregunta

sección

Si no se especifica ningún parámetro de caracteres en la cabecera Content-Type, RFC2616 3.7 0.1 parece implicar ISO8859-1 se debe suponer para los tipos de medios de subtipo "texto":

  

Cuando no hay ningún parámetro charset es explícita   proporcionado por el remitente, los subtipos de medios   del tipo "texto" se define para que tenga   un valor conjunto de caracteres por defecto de   "ISO-8859-1" cuando recibe a través de HTTP.

     

Los datos en juegos de caracteres distintos   "ISO-8859-1" o sus subconjuntos DEBEN ser   marcado con un juego de caracteres adecuado   valor.

Sin embargo, rutinariamente ver las aplicaciones que sirven archivos Javascript con valores de tipo de contenido como "application / x-javascript" (es decir, sin charset param), incluso cuando estos guiones contienen no-ASCII caracteres UTF-8, lo que sería corrupto si interpretarse como ISO8859-1.

Esto no parece plantear problemas a los clientes. ¿Cómo saben los clientes para interpretar los bytes como UTF-8? ¿Hay una regla para otros subtipos de caracteres de datos que implica UTF-8 debe ser el valor por defecto? ¿Dónde está esta documentado?

¿Fue útil?

Solución

Todos los principales navegadores He comprobado (IE, FF y Opera) completamente ignorar la especificación RFC en esta parte.

Si está interesado en el algoritmo de detección automática charset por los datos, vistazo a Mozilla Firefox enlace.

Sólo una pequeña nota sobre los tipos de contenido: Sólo texto tiene juegos de caracteres . Es razonable suponer que la aplicación mango navegadores / x-javascript, lo mismo que manejan text / javascript (excepto IE6, pero eso es otro tema).

Internet Explorer utilizará el juego de caracteres por defecto (probablemente almacenada en el Registro), como se indica:

  

De forma predeterminada, Internet Explorer utiliza el   juego de caracteres especificado en el protocolo HTTP   tipo de contenido devuelto por el servidor de   determinar esta traducción. Si esto   parámetro no se da, Internet   Explorer utiliza el juego de caracteres   especificada por el elemento meta en el   documento. Utiliza los usuarios de   preferencias si no hay elemento meta es   especificada.

Fuente : http : //msdn.microsoft.com/en-us/library/ms537500%28VS.85%29.aspx

Mozilla Firefox los intentos de detectar automáticamente el juego de caracteres, según ha apuntado aquí:

  

Este artículo presenta tres tipos de métodos de detección automática para determinar la codificación de documentos sin declaración explícita charset .

Fuente : http://www.mozilla.org /projects/intl/UniversalCharsetDetection.html

Opera utiliza la detección automática también, como se documenta:

  

Si el protocolo de transporte proporciona un nombre de codificación, que se utiliza. Si no es así, Opera se verá en la página de declaración charset. Si esto no está presente, Opera intentará detectar automáticamente la codificación , utilizando el nombre de dominio para ver si el guión es un guión CJK, y si es así cuál. Opera puede también detectar automáticamente UTF-8.

Fuente : http://www.opera.com/ docs / especificaciones / opera9 /

Otros consejos

Como se describe en RFC 4329 , también application/javascript puede tener un parámetro charset. La otra cuestión es el manejo de las implementaciones de navegador. Lo sentimos, pero no evaluados.

En la ausencia del parámetro charset, la codificación de caracteres se puede especificar en el contenido . He aquí algunos enfoques tomada por varios tipos de contenido:

HTML - A través de la meta tag :

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

HTML5 variante:

<meta charset="utf-8">

XML (XHTML, KML) - A través de la declaración XML :

<?xml version="1.0" encoding="UTF-8"?>

texto - A través de la marca de orden de bytes . Por ejemplo, para UTF-8 los tres primeros bytes de un archivo en formato hexadecimal:

EF BB BF

A diferencia del conjunto de caracteres asociado con el documento, nota también que los caracteres no ASCII puede ser codificado por medio de secuencias de caracteres ASCII utilizando diversos enfoques:

HTML - Via referencias de caracteres :

&#nnnn;
&#xhhhh;

XML - Via referencias de caracteres :

&amp;
&defined-entity;

JSON - A través de la mecanismo de escape :

\u005C
\uD834\uDD1E

Ahora, con respecto al protocolo HTTP 1.1, RFC 2616 dice que este sobre el conjunto de caracteres :

  

El parámetro "charset" se utiliza con algunos tipos de medios para definir la   juego de caracteres (sección 3.4) de los datos. Cuando hay charset explícita   parámetro es proporcionada por el remitente, los subtipos de medios del tipo "texto"   están definidos para tener un valor charset por defecto de "ISO-8859-1" cuando   recibida a través de HTTP. Los datos en los conjuntos de caracteres que no sea "ISO-8859-1" o   sus subconjuntos deben estar etiquetados con un valor de conjunto de caracteres correspondiente. Ver   la sección 3.4.1 para los problemas de compatibilidad.

Por lo tanto, mi interpretación de lo anterior es que un no puede asumir un conjunto de caracteres por defecto excepto para los subtipos de los medios de comunicación del tipo "texto". Por supuesto, vivimos en el mundo real y los ejecutores no siempre siguen las reglas. Como se describe en el respuesta aceptada , los diversos proveedores de navegadores web han puesto en práctica sus propias estrategias para determinar el conjunto de caracteres del documento cuando está no se especifica explícitamente. Uno puede asumir que los vendedores de otros clientes (por ejemplo, Google Earth) también poner en práctica sus propias estrategias.

RFC 4329 define los "/ aplicación javascript" medios escriba como un reemplazo para "text / javascript", "application / x-javascript", y otros tipos similares. Sección 4.2 establece el carácter de codificación por defecto para ser UTF-8 cuando ningún parámetro explícito "charset" está disponible y no Unicode BOM está presente en la parte delantera de los datos.

Es un poco especial para XMLHttpRequest y se describe aquí: http://www.w3.org / TR / XMLHttpRequest /

Al señalar lo obvio:. "Application / x-javascript" no es un subtipo de "texto"

Además, el texto en el RFC 2616 no está actualizado. La próxima revisión de HTTP / 1.1 no será definir un valor predeterminado. Consulte RFC 6657 para más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top