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


Answers:


321

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


11
需要注意的一件事是ASCII仅从0扩展到127。该MSB始终为0
Hritik

3
当定义了高于127的代码点时,编码系统是扩展ASCII的版本。
Rohan Bhale

1
@RohanBhale不要使用扩展ASCII短语。只会造成混乱。
李斯特先生

但是扩展的ascii可能是正确的术语。我阅读了多种资源
Rohan Bhale

135

Wikipedia很好地解释了两者:UTF-8Latin-1(ISO-8859-1)。前者是可变长度编码,后者是单字节固定长度编码。Latin-1仅编码Unicode字符集的前256个代码点,而UTF-8可以用于编码所有代码点。在物理编码级别上,只有0-127的代码点得到相同的编码。代码点128-255的不同之处在于,使用UTF-8变成2字节序列,而使用Latin-1则变为单字节。


@mu也许我的陈述是模棱两可的,但这不是不正确的-我不是在谈论编码的字节序列,而是在编码字符集。表示使用ISO-8859-1编码Unicode字符集的前256个代码点。
StaxMan

您的澄清对我有用,与“不正确”相比,“模棱两可”将是更好的选择。
亩太短了,

83

UTF

UTF是一系列多字节编码方案,可以表示Unicode代码点,最多可以表示2 ^ 31 [大约20亿]个字符。UTF-8是一种灵活的编码系统,使用1到4个字节表示前2 ^ 21 [大约200万]个代码点。

长话短说:任何代码点/序号表示低于127(又名7位安全ASCII)的字符都由与大多数其他单字节编码相同的1字节序列表示。代码点高于127的任何字符都由两个或多个字节组成的序列表示,此处详细说明了编码的细节。

ISO-8859

ISO-8859是一系列单字节编码方案,用于表示可以在127到255范围内表示的字母。这些各种字母被定义为ISO-8859- n格式中的“部分”,这是最常见的这些可能是ISO-8859-1又名“ Latin-1”。与UTF-8一样,无论使用哪种编码系列,7位安全ASCII都不会受到影响。

这种编码方案的缺点是无法容纳由128个以上的符号组成的语言,或者一次不能安全地显示一个以上的符号系列。同样,随着UTF的兴起,ISO-8859编码也不再受欢迎。负责它的ISO“工作组”于2004年解散,由其上级小组委员会负责维护工作。


1
+1用于回答问题,但不仅仅提供有关相关编码的信息。Re:UTF-8的代码点,根据stackoverflow.com/a/38488358/3353984,UTF-8支持2 ^ 21个代码点。这是一个错误,还是这里需要修复?
汤姆·洛瑞多

1
Unicode实际上是17个2 ^ 16代码点的平面。0x00_0000至0x1F_FFFF。这17架飞机可以容纳1,114,112个代码点。其中2,048个是代理人,66个是非字符,并且137,468个供私人使用,剩下974,530个用于公共任务,约100万。请参阅UTF-8可以编码多少个字符?
georgeawg

22
  • 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'

21

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


1
我已经看过Umlaut的地方应该不是用UTF8转换的。我们看到了这样的示例,并在搜索中找到了ISO-8859-1,它似乎可以正常工作。我们有很多与我们合作的德国科学家。
Aggie Jon

4
Umlaut在utf8中以两个字符表示。他们可以很好地转换并很好地工作。问题来自期望每个字符1个字节的程序。对于这些旧程序,ISO-8859-1具有1字节的umlaut。
Erik Aronesty

3

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


2

要实现的另一件重要事情:如果看到的话iso-8859-1,它可能是指Windows-1252,而不是ISO / IEC 8859-1。它们的范围为0x80–0x9F,其中ISO 8859-1具有C1控制代码,而Windows-1252具有有用的可见字符。

例如,ISO 8859-1的控制字符为0x85(在Unicode中为U + 0085,``''),而Windows-1252在水平方向上则使用省略号(在Unicode中为U + 2026水平椭圆, )。

WHATWG编码规范(13759 HTML)明确声明iso-8859-1是一个标签windows-1252,和Web浏览器不支持ISO 8859-1以任何方式:HTML规范说,在编码规范所有编码必须得到支持,并没有更多的。

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


糟糕!以为我已经写了,但是我重写了它。我已经把它放进去了。
克里斯·摩根

0

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

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


2
有用,但是我认为您在扩展的ASCII 255中是127而不是255?
Hydroper

18
Latin-1或iso-8859-1无法100%兼容存储在utf8中。高于127的任何Latin-n或iso-8859-n字符都不会转换为单字节utf-8字符。但是,对于值1-127,它们将精确转换。
马林·皮尔斯

4
这个答案在使用术语“扩展的ascii”时有点混乱,后者只是一个术语,指的是非ASCII的任何字符编码。UTF-8和latin-1是扩展ASCII编码的示例。但是,非ASCII拉丁文-1字符(即,高于127的代码点)不能在UTF-8中编码为单个字节。
rdb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.