关于utf 8:UTF-8和ISO-8859-1有什么区别?

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

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


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


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


统一潮流基金

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

长话短说:任何代码点/序数表示低于127的字符,即7位安全的ASCII,与大多数其他单字节编码一样,用相同的1字节序列表示。代码点高于127的任何字符都由两个或多个字节的序列表示,这里最好解释编码的特殊性。

ISO-859

ISO-8859是一系列单字节编码方案,用于表示可在127到255范围内表示的字母。这些不同的字母被定义为ISO-8859-N格式的"部分",其中最熟悉的可能是ISO-8859-1,也就是拉丁语-1。与UTF-8一样,7位安全的ASCII不受影响,而与使用的编码系列无关。

这种编码方案的缺点是它无法适应由128个以上符号组成的语言,或者一次不能安全地显示多个符号系列。此外,随着UTF的兴起,ISO-8859编码已经不再受欢迎。负责这项工作的国际标准化组织"工作组"已于2004年解散,其维护工作由其母委员会负责。


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


  • ASCII:7位。128个码位。

  • ISO-8859-1:8位。256个码位。

  • UTF-8:8-32位(1-4字节)。1112064个代码点。

ISO-8859-1和UTF-8都与ASCII向后兼容,但UTF-8与ISO-8859-1不向后兼容:

1
2
3
4
5
6
#!/usr/bin/env python3

c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))

输出:

1
2
3
?
b'\xc2\xa9'
b'\xa9'

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


我研究这个问题的原因是从这个角度来看,它们是以什么方式兼容的。Latin1字符集(ISO-8859)与UTF8数据存储区100%兼容。所有ASCII和扩展的ASCII字符都将存储为单字节。

另一方面,从utf8到latin1字符集可能工作,也可能不工作。如果有任何2字节字符(超过扩展ASCII255的字符),它们将不会存储在Latin1数据存储中。