我知道有两种设置编码的方法:
由于 Content-Type 标头不是强制性的,需要明确设置(服务器端可以根据需要设置),并且元标记也是可选的。
如果这两个都不存在,浏览器如何确定用于解析内容的编码?
我不知道今天的编译器在编码检测方面有多好,但 MS Word 在这方面做得非常好,甚至可以识别我以前从未听说过的字符集。你可以打开一个随机编码的 *.txt 文件并查看。
该算法通常涉及字节模式的统计分析,例如将被检测到的每个代码页中编码的各种语言的三合字母的频率分布;这种统计分析也可用于执行语言检测。
Firefox 使用Mozilla 字符集检测器。它的工作方式在这里解释,你也可以改变它的启发式偏好
Chrome 之前使用ICU 检测器,但大约2 年前改用CED
没有一个检测算法是完美的,他们可以像这样猜错,因为无论如何它都只是猜测!
这个过程并非万无一失,因为它取决于统计数据。
所以这就是著名的布什隐藏事实错误发生的方式。错误的猜测也会给系统带来漏洞
对于所有那些怀疑论者来说,有一个很好的理由为什么应该明确说明字符编码。当浏览器没有被告知文本的字符编码是什么时,它必须猜测:有时猜测是错误的。黑客可以操纵这个猜测,以便让 XSS 通过过滤器,然后欺骗浏览器将其作为活动代码执行。Google UTF-7 漏洞就是一个很好的例子。
http://htmlpurifier.org/docs/enduser-utf8.html#fixcharset-none
因此,应始终明确说明编码。