我知道http头中的参数charset = Content-Type可以用来确定html内容的字符集。但是如果Content-Type头中缺少参数,如何知道html内容的字符集呢?我也知道在HTML中有标签,如 “meta charset =”utf-8“” 用于指定字符集。但是,只有在解析html和解析html需要先了解字符集之后,我们才能获得该标记。如何通过http头知道html内容的字符集?
回答
为了查看<meta charset
元素,您完全正确的是需要开始解析HTML。
但是这是标准化的行为:您必须遵循编码嗅探算法,该算法开始处理HTML源直到它知道编码,然后使用已知编码进行解析。很明显,这是你想象中的局限性,所以你应该按照Quentin的评论检查spec,因为有很多情况需要注意。
基本上,如果内容可能是UTF-16(或UCS-2),您的嗅探器需要能够识别UTF-16字节顺序标记。并且它需要识别"<!--"
和"-->"
以跳过评论,并且"<meta "
或"<meta/"
为了识别元素的开始,其可以使用"http-equiv"
,"content"
或"charset"
标签。
创作HTML时,应确保<meta
元素尽可能早地在文件中,在前1024个字节内,并且最好在文件中首次出现任何非ASCII字符之前。
在Content-Type
标头中缺少明确的charset
属性时,通过不同传输发送的不同媒体类型具有不同的默认字符集。
例如,只是为了显示一些定义:
不像一些其他参数值,字符集参数值是不区分大小写。 缺少字符集参数时必须假定的缺省字符集是US-ASCII。
的“字符集”参数与某些介质类型用来定义数据的字符集(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.3和Section 5.3.3)。
RFC 3023,第3.1,3.3,3.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”。
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 spec,Appendix F,还定义了一种算法,可以很容易地确定由XML序言使用的字符集,所以你可以看它的属性Encoding
,如果存在的话,确定剩余XML的字符集。
- 1. 从HTML如何通过字段集内容的HTML
- 2. 如何知道字符的字符集?
- 3. 字符串查找到未知的字符集html内容
- 4. 通过http响应的头部和内容发起http请求
- 5. 是否有人知道什么字符集用于编码的HTTP标头?
- 6. 如何通过php请求在html中返回http内容?
- 7. 如何通过Document.insertString()方法知道插入字符的数量?
- 8. 要通知的内容允许:过载POST的标头
- 9. 通过替换HTML内容
- 10. 如何通过“分页符”分割一些html内容?
- 11. django如何知道http请求已通过身份验证?
- 12. 使用接收字符集HTTP标头
- 13. 如何知道内容长度
- 14. Java:通过HTTP传输Zipfile的内容
- 15. 套接字:获取未知的字符而不是HTML内容
- 16. 如何通过javascript知道html的显示部分是什么
- 17. 如何知道我的网站是通过HTTP还是HTTP/2提供服务?
- 18. 隧道通过HTTP
- 19. 如何从HTML()提取HTML()的内容时通过AJAX
- 20. 邮差:如何通过HTTP标头
- 21. 如何通过HTTP代理隧道?
- 22. HTTP内容类型响应中的错误字符集
- 23. 如何知道apache/php的默认字符集
- 24. 如何知道HTTP头部分何时结束?
- 25. 如何在HTTP Content-Type响应头中指定字符集?
- 26. 如何知道HTML标签字符串的渲染长度
- 27. 通过HTTP的SSH隧道
- 28. 如何通过TD内容
- 29. 如何让内容滚动而不通过我的头?
- 30. 如何通过反射返回字符串内容
https://www.w3.org/TR/html5/syntax.html#parsing-with-a-known-character-encoding – Quentin
您不需要知道HTML的实际字符集就可以解析它。您只需要知道它是使用8位,16位还是32位字符(8位是最常见的),并且在几个字节后很容易确定。 HTML标签本身是ASCII兼容的,所以一旦知道所使用的字符宽度,就可以阅读它们。然后,一旦找到合适的''标签,您就会知道如何解释HTML标签之外的文本数据。 –