3

这是一个 test.html 文件,用我的文本编辑器以 latin 1 格式保存:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
è
</body>
</html>

如果在 chrome 中查看文件,è 字符将显示为问号。我不明白为什么:è 是 latin 1 的一部分,而 latin 1 应该与 utf-8 的(子集)兼容,因此字符 è 的代码在 latin 1 和 utf-8 中不应该相同?

如果我将字符集更改为 ISO-8859-1,当然一切都很好。

谢谢

4

3 回答 3

8

您将字符集/代码页的概念与编码混淆了。UTF-8 和 ISO-8859-1 (Latin-1) 是编码,它们是如何以字节表示字符的系统,而不是您选择的字符列表。

您将文件保存为 ISO-8859-1,因此您的文件具有0xE8. 你告诉浏览器文件是用 UTF-8 编码的,所以浏览器会尝试根据 UTF-8 的规则来解码你的文件。并且0xE8在 UTF-8 中无效。

当您告诉浏览器在 ISO-8859-1 中对其进行解码时,它会起作用,因为它在 ISO-8859-10xE8中有效,并且根据 的值从 ISO-8859-1 的代码页中显示一个字符0xE8

此外,ISO-8859-1 是unicode(utf 编码的“代码页”)的子集,而不是 UTF-8。这意味着 ISO-8859-1 代码页中的前 256 个字符与 unicode 中的前 256 个字符相同。

还有更多。浏览器实际上从不使用 ISO-8859-1 来解码您的页面,而是秘密地使用 Windows-1252。这也已在HTML-5 草案中指定

于 2012-12-13T20:50:04.850 回答
1

如果将文件保存为 Latin 1,则编码为 UTF-8 的 charset 属性声明不正确。您必须以 charset 属性声明的编码保存文件。

于 2014-03-25T01:46:42.640 回答
1

128-255 范围内的 Latin-1 字符在 UTF-8 上下文中无效。尽管它们确实共享相同的字符代码,但在 UTF-8 中它们的表示方式不同。例如,è在 UTF-8 中实际上是è. 0xE8不是 UTF-8 字符串中的有效字符,除非它后面跟着\x80to\xBF范围内的两个字符,因此您会得到替换字符。

于 2012-12-13T20:45:28.607 回答