如何通过http标头知道html内容的字符集?

时间:2017-06-03 13:36:51

标签: html utf-8 character-encoding content-type character-set

我知道http头中的参数charset =:Content-Type可用于确定html内容的charset。但是如果Content-Type标头中缺少参数,那么如何知道html内容的字符集呢?我也知道有标签如         “meta charset =”utf-8“”  在html中用于指定charset。但是我们只有在解析html并解析html之后才能获得该标记需要首先知道charset。

2 个答案:

答案 0 :(得分:2)

您完全正确地需要开始解析HTML才能看到<meta charset元素。

但这是标准化行为:您必须遵循编码嗅探算法,该算法开始处理HTML源,直到它知道编码,然后使用已知编码进行重新分析。显然这会产生你想象的限制,所以你应该根据昆汀的评论查看spec,因为你需要注意很多案例。

基本上,如果内容可能是UTF-16(或UCS-2),您的嗅探器需要能够识别UTF-16字节顺序标记。它需要识别"<!--""-->"才能跳过评论,并"<meta ""<meta/"识别元素的开头,可以使用{{ 1}},"http-equiv""content"标记。

创作HTML时,应确保文件中"charset"元素尽可能早,在前1024个字节内,最好是在文件中第一次出现非ascii字符之前。< / p>

答案 1 :(得分:2)

如果charset标头中没有明确的Content-Type属性,则通过不同传输发送的不同媒体类型具有不同的默认字符集。

例如,只是为了显示一些定义:

RFC 2046,MIME规范的4.1.2部分说:

  

与其他一些参数值不同,charset参数的值不区分大小写。 默认字符集(在没有charset参数的情况下必须假设)是US-ASCII。

RFC 2616,HTTP协议规范的3.7.1部分说:

  

&#34; charset&#34;参数与某些媒体类型一起用于定义数据的字符集(section 3.4)。 当发件人没有提供明确的字符集参数时,&#34; text&#34;的媒体子类型type定义为默认字符集值为&#34; ISO-8859-1&#34;通过HTTP 收到。除了&#34; ISO-8859-1&#34;以外的字符集中的数据。或其子集必须用适当的字符集值标记。有关兼容性问题,请参阅section 3.4.1

后来被RFC 7231 Appendix B

推翻了
  

已删除文本媒体类型的ISO-8859-1默认字符集;现在默认为媒体类型定义。同样,已从Accept-Charset标题字段中删除了对ISO-8859-1的特殊处理。 (Section 3.1.1.3Section 5.3.3)。

RFC 3023,XML媒体类型规范的3.13.33.68.5部分说:

  

符合[RFC2046],如果收到text / xml实体且省略了charset参数,MIME处理器和XML处理器必须使用&#34; us-ascii&#34; [ASCII]的默认字符集值]。在通过HTTP传输XML MIME实体的情况下,默认的字符集值仍然是&#34; us-ascii&#34; 。 (注意:此规范与HTTP / 1.1之间存在不一致,由于历史原因,它使用ISO-8859-1 [ISO8859]作为默认值。由于XML是一种新格式,因此应选择新的默认值以获得更好的I18N。选择了US-ASCII,因为它是UTF-8和ISO-8859-1的交集,因为它已经被MIME使用了。)

  

text / xml-external-parsed-entity的charset参数的处理方式与text {xml的相同,如Section 3.1中所述。

  

以下列表适用于顶级类型&#34; text&#34;下的text / xml,text / xml-external-parsed-entity和基于XML的媒体类型。根据此规范定义charset参数:

     

...

     
      
  • 如果未指定charset参数,则默认为&#34; us-ascii&#34;。 &#34; iso-8859-1&#34;的默认值在HTTP中明确重写。
  •   

  

此示例显示省略了charset参数的text / xml。在这种情况下,MIME和XML处理器必须假设charset是&#34; us-ascii&#34;,[RFC2046]中指定的文本媒体类型的默认字符集值。 &#34; us-ascii&#34;的默认值即使使用HTTP传输text / xml实体,也会保留。

     

对于text / xml,不推荐省略charset参数。例如,即使XML MIME实体的内容是UTF-16或UTF-8,或者XML MIME实体具有显式编码声明,XML和MIME处理器也必须假设字符集是&#34; us-ascii&#34 ;

JSON规范的

RFC 71598.111部分说:

  

JSON文本应以UTF-8,UTF-16或UTF-32编码。默认编码为UTF-8 ,以UTF-8编码的JSON文本可以互操作,因为它们将通过最大数量的实现成功读取;有许多实现无法成功读取其他编码中的文本(例如UTF-16和UTF-32)。

     

实现绝不能在JSON文本的开头添加字节顺序标记。为了互操作性,解析JSON文本的实现可以忽略字节顺序标记的存在,而不是将其视为错误。

  

注意: No&#34; charset&#34;参数是为此注册定义的。添加一个对合规收件人没有任何影响。

因此,通常,如果您想知道给定资源使用的字符集,并且该字符集不是通过外部方式表达的,例如charset标题的Content-Type属性,那么您必须确定您正在处理的数据类型,然后根据数据类型规范的概述确定其字符集。

在您的情况下,您正在处理HTML over HTTP,因此RFC 2616规则适用于您。 HTML 5 spec8.2.2.2部分定义了一个非常详细的算法,用于在charset标题中未指定Content-Type属性时确定HTML的字符集。该算法首先检查是否存在UTF BOM,如果不存在,则假设HTML为8位,并对包含字符集或语言声明的任何<meta>标记进行解析。

XML 1.0 specAppendix F还定义了一种算法,可以轻松确定XML序言使用的字符集,以便您可以读取其Encoding属性(如果存在),以确定剩下的XML的字符集。