提问人:Jagadesh 提问时间:8/13/2011 最后编辑:Jagadesh 更新时间:4/10/2023 访问量:577401
UTF-8 和 ISO-8859-1 有什么区别?[已结束]
What is the difference between UTF-8 and ISO-8859-1? [closed]
问:
UTF-8 和 ISO-8859-1 有什么区别?
答:
UTF-8 是一种多字节编码,可以表示任何 Unicode 字符。ISO 8859-1 是一种单字节编码,可以表示前 256 个 Unicode 字符。两者的 ASCII 编码方式完全相同。
评论
维基百科很好地解释了两者:UTF-8 与 Latin-1 (ISO-8859-1)。前者是可变长度编码,后者是单字节固定长度编码。 Latin-1 仅对 Unicode 字符集的前 256 个码位进行编码,而 UTF-8 可用于对所有码位进行编码。在物理编码级别,只有代码点 0 - 127 的编码完全相同;码位 128 - 255 的不同之处在于 UTF-8 的 2 字节序列,而 Latin-1 的代码点是单字节。
评论
ISO-8859-1 是 1980 年代的遗留标准。它只能表示 256 个字符,因此仅适用于西方世界的某些语言。即使对于许多受支持的语言,也会缺少某些字符。如果您以这种编码创建一个文本文件并尝试复制/粘贴一些汉字,您会看到奇怪的结果。所以换句话说,不要使用它。Unicode 已经占领了世界,UTF-8 几乎是当今的标准,除非您有一些遗留原因(例如需要与所有内容兼容的 HTTP 标头)。
评论
UTF格式
UTF 是一系列多字节编码方案,可以表示 Unicode 码位,最多可以代表 2^31 [大约 20 亿] 个字符。UTF-8 是一种灵活的编码系统,它使用 1 到 4 个字节来表示前 2^21 [大约 200 万个] 码位。
长话短说:任何代码点/序数表示低于 127 的字符,即 7 位安全 ASCII,都由与大多数其他单字节编码相同的 1 字节序列表示。任何码位大于 127 的字符都由两个或多个字节的序列表示,此处最好解释编码的细节。
国际标准化组织-8859
ISO-8859 是一系列单字节编码方案,用于表示可在 127 到 255 范围内表示的字母。这些不同的字母表被定义为 ISO-8859-n 格式的“部分”,其中最熟悉的可能是 ISO-8859-1 又名“Latin-1”。与 UTF-8 一样,无论使用何种编码系列,7 位安全 ASCII 都不会受到影响。
这种编码方案的缺点是它无法容纳由超过 128 个符号组成的语言,也无法安全地同时显示多个符号系列。同样,随着 UTF 的兴起,ISO-8859 编码也不再受欢迎。负责它的ISO“工作组”已于2004年解散,将维护工作留给其上级小组委员会。
Windows 代码页
值得一提的是,Microsoft还维护了一组与ISO-8859兼容性有限的字符编码,通常表示为“cp####”。MS 似乎正在推动他们最近的产品版本以一种或另一种形式使用 Unicode,但出于遗留和/或互操作性的原因,您仍然可能会遇到它们。
例如,cp1252 是 ISO-8859-1 的超集,包含该范围内的其他可打印字符,特别是欧元符号和备受诟病的“智能引号”。这通常会导致不匹配,其中 8859-1 可以显示为 1252 完全正常,而 1252 可能看起来显示为 8859-1,但当其中一个额外的符号出现时,就会出现异常。0x80-0x9F
€
“”
除了 cp1252 之外,土耳其语 cp1254 是 ISO-8859-9 的类似超集,但所有其他 Windows 代码页至少存在一些基本冲突,即使与它们的 8859 等效代码页不完全相同。
评论
我研究这个问题的原因是从角度来看,它们是以何种方式兼容的。Latin1 字符集 (iso-8859) 100% 兼容存储在 utf8 数据存储中。所有 ascii 和 extended-ascii 字符都将存储为单字节。
反过来说,从 utf8 到 Latin1 字符集可能有效,也可能无效。如果有任何 2 字节字符(超出扩展 ascii 255 的字符),它们将不会存储在 Latin1 数据存储中。
评论
从另一个角度来看,unicode 和 ascii 编码都无法读取的文件,因为它们中有一个字节,似乎可以被 iso-8859-1 正确读取。需要注意的是,该文件当然不应该包含 unicode 字符。0xc0
ASCII:7 位。128 个代码点。
ISO-8859-1:8 位。256 个代码点。
UTF-8:8-32 位(1-4 字节)。1,112,064 个代码点。
ISO-8859-1 和 UTF-8 都向后兼容 ASCII,但 UTF-8 不向后兼容 ISO-8859-1:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
输出:
©
b'\xc2\xa9'
b'\xa9'
还有一件重要的事情要意识到:如果你看到,它可能指的是 Windows-1252 而不是 ISO/IEC 8859-1。它们在 0x80–0x9F 的范围内有所不同,其中 ISO 8859-1 具有 C1 控制代码,而 Windows-1252 具有有用的可见字符。iso-8859-1
例如,ISO 8859-1 将 0x85 作为控制字符(在 Unicode 中为 U+0085,''),而 Windows-1252 具有水平省略号(在 Unicode 中为 U+2026 水平省略号,)。…
WHATWG 编码规范(如 HTML 使用的那样)明确声明为 的标签,并且 Web 浏览器不以任何方式支持 ISO 8859-1:HTML 规范规定必须支持编码规范中的所有编码,仅此而已。iso-8859-1
windows-1252
同样有趣的是,HTML 数字字符引用本质上使用 Windows-1252 作为 8 位值而不是 Unicode 码位;每 https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state,将产生 U+2026 而不是 U+0085。…
评论