【问题标题】:Showing a latin 1 character in a UTF-8 page在 UTF-8 页面中显示 latin 1 字符
【发布时间】:2012-12-01 19:58:42
【问题描述】:

这是一个 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,当然一切都很好。

谢谢

【问题讨论】:

标签: html utf-8 character-encoding


【解决方案1】:

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

【讨论】:

  • UTF-8 中的 è 不是“实际上 è”。 UTF-8 中的 è 是 è。如果您愿意,可以比较字节,而不是字符。
【解决方案2】:

您将字符集/代码页的概念与编码混淆了。 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

中指定

【讨论】:

  • 我知道字符集和编码之间的区别,是的,我知道 ISO-8859-1 是 unicode(不是 utf-8)的子集,但我仍然不明白:我的假设适用于前 128 个字符,所以如果我写的是 e 而不是 è,那么一切正常。我认为不仅前 128 个字符在 latin1 和 utf-8 中具有相同的代码,而且所有 256 个字符......所以这是我假设的错误部分吗?
  • @Eugenio 前 128 个字符在 ISO-8859-1 和 UTF-8 中的编码完全相同。实际上,它们在大多数编码中的编码完全相同......无论如何,128 个字符中的另一半在 UTF-8 和 ISO-8859-1 中编码不同,这使得 ISO-8859-1 与 UTF-8 不兼容.
  • 这意味着如果存在编码问题,如果只使用前 128 个字符,则它是不可见的。 unicode 中的第 172 个字符与 ISO-8859-1 中的第 172 个字符相同。但是在 UTF-8 中编码时,字节序列为0xC2, 0xAC,而在 ISO-8859-1 中编码时,字节序列为0xAC。在 ISO-8859-1 中,0xC2, 0xAC¬,而在 UTF-8 中,`0xAC 是无效的。
  • 好的,现在说得通了。阅读诸如“ISO-8859-1 被合并为 ISO/IEC 10646 和 Unicode 的前 256 个代码点”之类的内容(例如,您可以在维基百科上阅读)可能会产生误导。谢谢。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2015-04-22
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2011-05-17
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多