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

UTF-8和ISO-8859-1之间有什么区别?,utf-8,character-encoding,iso-8859-1,Utf 8,Character Encoding,Iso 8859 1,和之间的区别是什么?UTF-8是一种可以表示任何Unicode字符的多字节编码。ISO 8859-1是一种单字节编码,可以表示前256个Unicode字符。两者编码ASCII的方式完全相同。维基百科对这两种方法的解释相当好:vs(ISO-8859-1)。前者是可变长度编码,后者是单字节定长编码。 Latin-1仅编码Unicode字符集的前256个代码点,而UTF-8可用于编码所有代码点。在物理编码级别,只有0-127码点得到相同的编码;128-255代码点的不同之处在于,UTF-8变为2字节序

和之间的区别是什么?

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

维基百科对这两种方法的解释相当好:vs(ISO-8859-1)。前者是可变长度编码,后者是单字节定长编码。
Latin-1仅编码Unicode字符集的前256个代码点,而UTF-8可用于编码所有代码点。在物理编码级别,只有0-127码点得到相同的编码;128-255代码点的不同之处在于,UTF-8变为2字节序列,而拉丁语-1变为单字节序列。

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

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

长话短说:任何代码点/顺序表示低于127的字符(也称为7位安全ASCII)都由与大多数其他单字节编码相同的1字节序列表示。代码点大于127的任何字符都由两个或更多字节的序列表示,最好解释编码的细节

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


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

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


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

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

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

#!/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'

还有一件更重要的事情需要意识到:如果您看到
iso-8859-1
,它可能指的是而不是。它们在0x80–0x9F范围内有所不同,其中ISO 8859-1具有C1控制代码,而Windows-1252具有有用的可见字符

例如,ISO 8859-1使用0x85作为控制字符(在Unicode中,U+0085,````),而Windows-1252使用水平省略号(在Unicode中,U+2026水平省略号,

(由HTML使用)明确声明
iso-8859-1
windows-1252
的标签,web浏览器不以任何方式支持iso 8859-1:HTML规范规定必须支持编码规范中的所有编码,仅此而已


同样有趣的是,HTML数字字符引用基本上使用Windows-1252来表示8位值,而不是Unicode代码点;根据,
和#x85
将生成U+2026而不是U+0085。

@mu也许我的说法不明确,但它并没有错——我说的不是编码的字节序列,而是编码的字符集;这意味着ISO-8859-1用于对Unicode字符集的前256个代码点进行编码。您的说明对我很有效,“含糊不清”比“不正确”更好。这很有帮助,但我认为您在扩展ascii 255?拉丁语-1中指的是127而不是255,或者ISO-8859-1不能100%兼容存储在utf8中。127以上的任何拉丁语-n或iso-8859-n字符都不会转换为单字节utf-8字符。但是,对于值1-127,它们将准确地进行转换。这个答案在使用术语“扩展ascii”时有点混乱,这只是一个用于指代任何非ascii字符编码的术语。UTF-8和拉丁语-1是扩展ASCII编码的示例。但是,非ascii拉丁-1字符(即127以上的代码点)不能在UTF-8中编码为单个字节。在UTF-8中,2字节编码从128开始。但是,两者中都有匹配的字符,因此可以无损转换:ISO 8859-1->UTF-8->ISO 8859-1,但如果UTF-8文档中有任何大于255的字符,则无法无损转换。需要注意的是,ASCII仅从0扩展到127。MSB始终为0。定义127以上的代码点时,编码系统为Ext版本