![“没有纯文本这种东西。”](https://linux22.com/image/1429365/%E2%80%9C%E6%B2%A1%E6%9C%89%E7%BA%AF%E6%96%87%E6%9C%AC%E8%BF%99%E7%A7%8D%E4%B8%9C%E8%A5%BF%E3%80%82%E2%80%9D.png)
根据本文档(我确信,在许多其他地方也是如此),为浏览器声明给定文件中使用的字符编码非常重要。
大多数文本编辑器(和类似的程序file
)似乎可以毫无问题地自动检测文件的字符编码。
为什么浏览器需要在文件中声明这些信息?
当没有声明编码时,它们似乎猜得很好,但在“特殊”字符上似乎仍然会失败。
答案1
他们没有需要但建议提供该信息,因为猜测错误的字符集可能会
- 导致页面无法读取(仅部分或全部页面)
- 给系统带来可能的漏洞
“没有纯文本这种东西。”
在 Unicode 出现之前,计算机使用各种代码页和编码方案记录不同的脚本。不幸的是,糟糕的是文件中没有嵌入任何编码信息。这种情况不会消失,不同的字符集和编码将继续存在。文本编辑器必须使用适当的编码打开文本文件才能获得真正的代码点,然后以正确的字符集呈现它。但是,由于他们不知道文件采用的是什么编码,他们必须猜测它使用启发式
该算法通常涉及字节模式的统计分析,例如要检测的每个代码页中编码的各种语言的三字母组合的频率分布;这种统计分析也可用于执行语言检测。
Firefox 使用Mozilla 字符集检测器. 解释其工作原理这里您还可以改变其启发式偏好. Chrome 以前使用ICU探测器但改用加拿大环境发展委员会几乎2年前
[更新:Firefox 已移至查德顿自 Firefox 73 起]
大多数情况下,它们都会正确猜测编码,但算法更适合单词,因此它们可能会对许多符号失败。由于 UTF-8/16/32 的编码方式,Unicode 编码通常更容易猜测。您还可以通过输入物料清单一开始。
但总体而言,没有办法可靠地猜测所有编码和字符集,因为同一个字节流可能同时在多种编码中有效。最终他们可能会犯错误像这样,因为无论如何这只是猜测!这也是著名的布什隐瞒了事实在 Vista 之前的记事本中出现了一个错误,当 APIIsTextUnicode
认为纯 ASCII 文本文件是 UTF-16LE 文件时,文件内容在 UTF-16LE 中看起来也是正常的。
错误的猜测也会给系统带来漏洞,就像 David 的回答中提到的 Google UTF-7 漏洞一样。因此,编码应该始终明确说明。
好消息是,大多数字符集在前 127 个代码点上都一致,因此浏览器只需使用默认(或任何合适的)字符集从标头读取第一个字节,直到看到meta
标签内的字符集选项。如果字符集错误,则它将使用文件内容中给定的字符集重新打开文件。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
阅读更多:
答案2
无嵌入编码
如果是这种情况,您需要在网站上添加适当的 META 标签。只需复制粘贴上面的代码片段,然后将 UTF-8 替换为您实际编码的 MIME 名称即可。
对于所有那些怀疑论者来说,有一个很好的理由说明为什么应该明确说明字符编码。当浏览器不知道文本的字符编码是什么时,它必须猜测:有时猜测是错误的。黑客可以操纵这种猜测,以便让 XSS 绕过过滤器,然后欺骗浏览器将其作为活动代码执行。Google UTF-7 漏洞就是一个很好的例子。
只要您的 Web 服务器发送正确的 Content-Type 标头,您可能无需使用 META 标记指定字符编码,但为什么要冒这个险呢?此外,如果用户下载 HTML 文件,则不再有任何 Web 服务器来定义字符编码。