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

时间:2011-08-13 05:21:30

标签: utf-8 character-encoding iso-8859-1

UTF-8ISO-8859-1之间的区别是什么?

8 个答案:

答案 0 :(得分:286)

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

答案 1 :(得分:117)

维基百科解释得非常好:UTF-8 vs Latin-1(ISO-8859-1)。前者是可变长度编码,后者是单字节固定长度编码。 Latin-1仅编码Unicode字符集的前256个代码点,而UTF-8可用于编码所有代码点。在物理编码级别,只有代码点0 - 127被编码相同;代码点128 - 255的区别在于使用UTF-8成为2字节序列,而它们是Latin-1的单字节。

答案 2 :(得分:64)

UTF

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

长话短说:任何具有低于127的代码点/序数表示的字符,即7位安全的ASCII由与大多数其他单字节编码相同的1字节序列表示。代码点大于127的任何字符都由两个或多个字节的序列表示,编码特别解释为here

ISO-8859

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

这种编码方案的缺点是它不能容纳超过128个符号的语言,或者一次安全地显示多个符号系列。同样,随着UTF的兴起,ISO-8859编码已经失宠。 ISO"工作组"在2004年解散了它,将维护工作留给了其母公司小组委员会。

答案 3 :(得分:14)

ISO-8859-1是20世纪80年代的传统标准。它只能代表256个字符,因此只适用于西方世界的某些语言。即使对于许多支持的语言,也缺少一些字符。如果您使用此编码创建文本文件并尝试复制/粘贴一些中文字符,您将看到奇怪的结果。换句话说,不要使用它。 Unicode已经占据了全世界,UTF-8现在几乎就是标准,除非你有一些遗留的原因(比如需要与所有东西兼容的HTTP头)。

答案 4 :(得分:9)

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

答案 5 :(得分:4)

还有一件重要的事情要实现:如果看到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水平椭圆,{{1} }。

WHATWG Encoding spec(由HTML使用)明确声明iso-8859-1的标签,并且Web浏览器不以任何方式支持ISO 8859-1:HTML规范说必须支持Encoding规范中的所有编码,并且不再受支持。

同样令人感兴趣的是,HTML数字字符引用本质上使用Windows-1252表示8位值,而不使用Unicode代码点。每https://html.spec.whatwg.org/#numeric-character-reference-end-statewindows-1252会产生U + 2026而不是U + 0085。

答案 6 :(得分:0)

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

另一方面,从utf8到Latin1 charset可能会也可能不会起作用。如果有任何2字节字符(超出扩展-ascii 255的字符),它们将不会存储在Latin1数据存储区中。

答案 7 :(得分:0)

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