这是一个test.html文件,使用我的文本编辑器以latin 1格式保存:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
è
</body>
</html>
如果以chrome格式查看文件,则è字符显示为问号。我不明白为什么:è是拉丁语1的一部分,拉丁语1应该与utf-8的(子集)兼容,所以字符è的代码在latin 1和utf-8中不应该相同?
如果我将charset更改为ISO-8859-1,当然一切都很好。
由于
答案 0 :(得分:6)
您将字符集/代码页的概念与编码混淆。 UTF-8和ISO-8859-1(Latin-1)是编码,它们是如何以字节表示字符的系统,而不是您选择的字符列表。
您将文件另存为ISO-8859-1,因此您的文件为0xE8
。您告诉浏览器该文件是以UTF-8编码的,因此浏览器会尝试根据UTF-8的规则解码您的文件。并且0xE8
在UTF-8中无效。
当您告诉浏览器在ISO-8859-1中对其进行解码时,它可以正常工作,因为0xE8
在ISO-8859-1中有效,并且根据ISO-8859-1的代码页显示一个字符0xE8
的价值。
此外,ISO-8859-1是 unicode (utf编码的“代码页”)的子集,而不是UTF-8。这意味着ISO-8859-1代码页中的前256个字符与unicode中前256个字符的字符相同。
还有更多。浏览器实际上从不使用ISO-8859-1来解码您的页面,而是秘密使用Windows-1252。这也已在HTML-5 draft
中指定答案 1 :(得分:0)
128-255范围内的Latin-1字符在UTF-8上下文中无效。虽然它们共享相同的字符代码,但在UTF-8中它们的表示方式不同。例如,UTF-8中的è
实际上是è
。 0xE8
不是UTF-8字符串中的有效字符,除非后跟\x80
到\xBF
范围内的两个字符,因此您将获得替换字符。
答案 2 :(得分:0)
如果将文件保存为Latin 1,则编码为UTF-8的charset属性声明不正确。 您必须以charset属性声明的编码保存文件。