2017-06-03 27 views
1

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

+1

https://www.w3.org/TR/html5/syntax.html#parsing-with-a-known-character-encoding – Quentin

+0

您不需要知道HTML的实际字符集就可以解析它。您只需要知道它是使用8位,16位还是32位字符(8位是最常见的),并且在几个字节后很容易确定。 HTML标签本身是ASCII兼容的,所以一旦知道所使用的字符宽度,就可以阅读它们。然后,一旦找到合适的''标签,您就会知道如何解释HTML标签之外的文本数据。 –

回答

1

为了查看<meta charset元素,您完全正确的是需要开始解析HTML。

但是这是标准化的行为:您必须遵循编码嗅探算法,该算法开始处理HTML源直到它知道编码,然后使用已知编码进行解析。很明显,这是你想象中的局限性,所以你应该按照Quentin的评论检查spec,因为有很多情况需要注意。

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

创作HTML时,应确保<meta元素尽可能早地在文件中,在前1024个字节内,并且最好在文件中首次出现任何非ASCII字符之前。

1

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

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

RFC 2046,在MIME规范第4.1.2说:

不像一些其他参数值,字符集参数值是不区分大小写。 缺少字符集参数时必须假定的缺省字符集是US-ASCII。

RFC 2616,HTTP协议规范的章节3.7.1说:

的“字符集”参数与某些介质类型用来定义数据的字符集(section 3.4)。 如果发件人未提供明确的字符集参数,则通过HTTP收到时,“文本”类型的媒体子类型的默认字符集值定义为“ISO-8859-1”。除“ISO-8859-1”或其子集以外的字符集中的数据必须用适当的字符集值标记。有关兼容性问题,请参阅section 3.4.1

后来被RFC 7231逆转,Appendix B

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

RFC 3023,第3.13.33.6和XML媒体类型的8.5 SPEC说:

如果与字符集参数收到一个文本/ XML实体

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

文本/ XML的字符集参数如Section 3.1中所述,外部分析实体的处理方式与text/xml的相同。

以下列表适用为text/xml,文本/ XML的外部解析实体,并在顶层类型“文本”定义字符集的基于XML的媒体类型根据此规格参数:

...

  • 如果未指定字符集参数,默认为 “US-ASCII”。 HTTP中“iso-8859-1”的默认值被显式覆盖。

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

省略字符集参数不推荐用于text/xml。例如,即使XML MIME实体的内容是UTF-16或UTF-8,或者XML MIME实体具有明确的编码声明,XML和MIME处理器也必须假定字符集是“us-ascii”。

RFC 7159,第8.111,的JSON规范说:

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

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

注:否 “字符集” 参数对该登记定义。添加一个真正对符合收件人没有影响。

因此,在一般情况下,如果你想知道一个给定的资源使用的字符集,以及字符集不通过外部手段表达,像Content-Type头的charset属性,那么你必须确定什么类型您正在处理的数据,然后根据该数据类型的规范概述确定其字符集。

在你的情况,你是在处理HTML通过HTTP,所以RFC 2616的规则适用于你。的HTML 5 spec,第8.2.2.2定义当在Content-Type头没有指定charset属性确定HTML的charset一个非常详细的算法。该算法首先检查是否存在UTF BOM,如果没有,则假定HTML为8位,并对包含字符集或语言声明的任何<meta>标签进行解析。

XML 1.0 specAppendix F,还定义了一种算法,可以很容易地确定由XML序言使用的字符集,所以你可以看它的属性Encoding,如果存在的话,确定剩余XML的字符集。