当您使用 URI 验证时,服务器应该在 HTTP 标头中宣布字符编码,更准确地说是在标头值的charset
参数中。Content-Type
在这种情况下,这显然不会发生。您可以检查情况,例如使用Rex Swain 的 HTTP 查看器。
根据条款4.2.5.5在 HTML5 CR 中指定文档的字符编码,“如果 HTML 文档不以 BOM 开头,并且其编码未由 Content-Type 元数据明确给出,并且该文档不是 iframe srcdoc 文档,那么所使用的字符编码必须是与 ASCII 兼容的字符编码,并且必须在 Encoding 声明状态下使用具有 charset 属性的元元素或具有 http-equiv 属性的元元素来指定编码。” 这有点复杂,但底线是:声明编码的方法有多种,但如果都不使用,则文档不符合要求。
为什么它如此指定有点推测,但一般的想法是这样的规则促进了可靠性和稳健性。当不遵守规则时,不同的浏览器可能会使用不同的默认值或猜测。
验证器假定 windows-1252,因为这是 HTML5 规则导致的。处理规则见8.2.2.1 确定字符编码。它们相当复杂,但它们在很大程度上反映了现代浏览器的工作方式(并旨在使其成为标准)。那里的规则也旨在处理不符合要求的文件,但这并不能使这些文件符合要求;错误处理规则并不是真正的“后备”,不应依赖,特别是因为旧浏览器并不总是遵守规则。
当遇到其他一切都失败并且要使用“实现定义的或用户指定的默认字符编码”的情况时,错误规则会变得有些松散。关于浏览器可能做什么只有“建议”(再次反映现代浏览器通常做什么),这可能涉及使用“用户的区域设置”,一个模糊的概念。然后验证器使用 windows-1252,可能是因为这是英语的默认设置并且验证器会“说”英语,或者可能只是因为它的猜测比任何其他单一替代方案更经常被认为是正确的。