UTF-8 和 ISO-8859-1 有什么区别?[已结束]

What is the difference between UTF-8 and ISO-8859-1? [closed]

提问人:Jagadesh 提问时间:8/13/2011 最后编辑:Jagadesh 更新时间:4/10/2023 访问量:577401

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

3年前关闭。

UTF-8ISO-8859-1 有什么区别?

UTF-8 字符编码 ISO-8859-1

评论


答:

397赞 Ignacio Vazquez-Abrams 8/13/2011 #1

UTF-8 是一种多字节编码,可以表示任何 Unicode 字符。ISO 8859-1 是一种单字节编码,可以表示前 256 个 Unicode 字符。两者的 ASCII 编码方式完全相同。

评论

22赞 Hritik 1/27/2018
需要注意的一点是,ASCII 仅从 0 扩展到 127。MSB 始终为 0。
3赞 Rohan Bhale 8/1/2019
当定义大于 127 的码位时,编码系统是扩展 ASCII 的一个版本。
7赞 Mr Lister 3/20/2020
@RohanBhale 不要使用短语 Extended ASCII;这只会引起混乱。
1赞 Rohan Bhale 3/20/2020
但扩展的 ascii 可能是正确的术语。我在多个资源上阅读了它
0赞 3/17/2022
我总是把它听成高 ASCII
160赞 StaxMan 8/13/2011 #2

维基百科很好地解释了两者:UTF-8Latin-1 (ISO-8859-1)。前者是可变长度编码,后者是单字节固定长度编码。 Latin-1 仅对 Unicode 字符集的前 256 个码位进行编码,而 UTF-8 可用于对所有码位进行编码。在物理编码级别,只有代码点 0 - 127 的编码完全相同;码位 128 - 255 的不同之处在于 UTF-8 的 2 字节序列,而 Latin-1 的代码点是单字节。

评论

0赞 StaxMan 8/14/2011
@mu也许我的陈述是模棱两可的,但它并没有错——我说的不是编码的字节序列,而是被编码的字符集;这意味着 ISO-8859-1 用于对 Unicode 字符集的前 256 个码位进行编码。
1赞 mu is too short 8/14/2011
你的澄清对我有用,“模棱两可”会比“不正确”更好的词选择。
27赞 Shital Shah 6/4/2016 #3

ISO-8859-1 是 1980 年代的遗留标准。它只能表示 256 个字符,因此仅适用于西方世界的某些语言。即使对于许多受支持的语言,也会缺少某些字符。如果您以这种编码创建一个文本文件并尝试复制/粘贴一些汉字,您会看到奇怪的结果。所以换句话说,不要使用它。Unicode 已经占领了世界,UTF-8 几乎是当今的标准,除非您有一些遗留原因(例如需要与所有内容兼容的 HTTP 标头)。

评论

1赞 Aggie Jon of 87 7/25/2018
我已经看到 Umlaut 的地方不应该用 UTF8 转换。我们看到了这方面的例子,在搜索中我们找到了 ISO-8859-1,它似乎有效。我们有很多德国科学家与我们合作。
5赞 Erik Aronesty 9/14/2018
Umlaut 在 utf8 中表示为两个字符。它们转换良好且效果良好。问题来自期望每个字符 1 个字节的程序。对于这些遗留程序,ISO-8859-1 具有 1 字节变音符号。
2赞 AndreasRu 4/11/2021
“换句话说,不要使用它。”我会这么说,因为在某些用例中,ISO-8859-1 比 UTF-8 更适合,因为单字节和 256 个字符就足够了,从而可以加快处理速度并减少有效载荷。
0赞 Caleb McNevin 6/19/2021
例如,首选单字节编码,SMS 消息的限制为 140 字节,主要使用单字节编码。如果您是一家发送自动 SMS 消息的企业,您不希望仅仅为了不使用旧标准而将成本翻倍。
120赞 Sammitch 8/24/2016 #4

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 等效代码页不完全相同。

评论

2赞 Tom Loredo 12/17/2018
+1 表示回答问题,但超越并提供有关相关编码的信息。回复:UTF-8 的码位,根据 stackoverflow.com/a/38488358/3353984,UTF-8 支持 2^21 个码位。这是一个错误,还是这里可能需要修复?
1赞 georgeawg 12/12/2019
Unicode 实际上是 17 个平面的 2^16 个码位。0x00_0000 0x1F_FFFF。这 17 架飞机可容纳 1,114,112 个代码点。其中,2,048 个是代理,66 个是非字符,137,468 个保留给私人使用,剩下 974,530 个用于公共分配,约 100 万。请参阅 UTF-8 可以编码多少个字符?
0赞 Alan Jurgensen 9/2/2016 #5

我研究这个问题的原因是从角度来看,它们是以何种方式兼容的。Latin1 字符集 (iso-8859) 100% 兼容存储在 utf8 数据存储中。所有 ascii 和 extended-ascii 字符都将存储为单字节。

反过来说,从 utf8 到 Latin1 字符集可能有效,也可能无效。如果有任何 2 字节字符(超出扩展 ascii 255 的字符),它们将不会存储在 Latin1 数据存储中。

评论

2赞 3/20/2017
有帮助,但我认为您的意思是 127 而不是扩展 ascii 255 中的 255?
24赞 Marlin Pierce 11/29/2017
Latin-1 或 iso-8859-1 不是 100% 兼容存储在 utf8 中。任何高于 127 的 Latin-n 或 iso-8859-n 字符都不会转换为单个字节 utf-8 字符。但是,对于值 1-127,它们将完全转换。
6赞 rdb 4/18/2018
这个答案在使用术语“扩展 ASCII”时有点令人困惑,它只是一个术语,指的是任何非 ASCII 的字符编码。UTF-8 和 latin-1 是扩展 ASCII 编码的示例。但是,非 ASCII 拉丁 1 字符(即 127 以上的码位)不能以 UTF-8 编码为单个字节。
0赞 silicontrip 10/24/2020
在 UTF-8 中,2 字节编码从 128 开始。但是,两者都有匹配的字符,因此可以无损地使用:ISO 8859-1 -> UTF-8 -> ISO 8859-1,但如果 UTF-8 文档中有任何字符大于 255,则无法无损转换。
3赞 Nikhil VJ 4/15/2018 #6

从另一个角度来看,unicode 和 ascii 编码都无法读取的文件,因为它们中有一个字节,似乎可以被 iso-8859-1 正确读取。需要注意的是,该文件当然不应该包含 unicode 字符。0xc0

39赞 Cyker 10/29/2018 #7
  • 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'
4赞 Chris Morgan 3/19/2020 #8

还有一件重要的事情要意识到:如果你看到,它可能指的是 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-1windows-1252

同样有趣的是,HTML 数字字符引用本质上使用 Windows-1252 作为 8 位值而不是 Unicode 码位;每 https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state,将产生 U+2026 而不是 U+0085。…