我正在创作HTML5文档,有点惊讶的是,在我测试过的浏览器(Safari、Chrome、Firefox -截至2023年2月的最新版本,macOS)上,默认文本编码(没有HTTP头或 meta元素设置)默认为windows-1252。
特别是,我使用了<!DOCTYPE html>
,但忘记添加<meta charset="utf-8">
元素,如果我在本地打开文件,浏览器会自动检测,并在出现非ascii字符时使用utf-8,但如果文件是通过Web服务器提供的,则不会。
我知道浏览器不能简单地默认为utf-8的所有HTML文件,由于旧的内容和自动检测HTTP服务的内容是困难的(推理描述在这里https://hsivonen.fi/utf-8-detection/)。
然而,我不明白的是,为什么标准模式下的现代HTML5文档(设置了doctype)在默认情况下不使用utf-8?
编辑:类似的Why it's necessary to specify the character encoding in an HTML5 document if the default character encoding for HTML5 is UTF-8?问题问的是,如果(错误地)假设utf-8为默认值,为什么需要设置编码,而不是默认值是什么(或如何选择)。
1条答案
按热度按时间n1bvdmb61#
通过this question(感谢exa. byte和Rob!)和HTML spec,我相信我能够拼凑出一个答案。
简短回答:不,HTML5没有默认的字符编码(但请继续阅读)。
长回答:显然浏览器会使用一些编码来显示页面。如果没有指定任何编码,算法首先使用自动检测,在我的测试中,浏览器实际上是对本地文件进行自动检测的(URL以
file://
开始),有些甚至可以对远程文件执行此操作,但标准不鼓励对超过前1KB的远程文件执行此操作(这是meta charset标签的位置).建议限制在前1kb以避免解析延迟太长时间.浏览器也可以完全跳过自动检测步骤(我相信这是Firefox对远程文件所做的).旁注:以上未指定编码意味着没有BOM、没有带字符集的Content-Type、没有meta标记、没有从父iframe继承,也没有XML声明(是的,这也用于text/html)。
因此,如果自动检测没有选择编码,比如有多种可能性,或者浏览器当时没有足够的可用数据,浏览器会选择一个 * 实现定义的 * 选项。这可能与浏览器有关,但HTML5建议在受控环境中使用utf-8,否则建议使用基于本地化的默认值(此处#9)。
最后,解释一下我在获取windows-1252编码时看到的行为,原因是a)自动检测失败(非ascii字符在页面末尾)和b)我使用的浏览器根据我的首选/选定区域设置选择了它。