UTF-8和ISO-8859-1有什么区别?
当前回答
我研究这个问题的原因是从这个角度,他们在什么方面是兼容的。Latin1字符集(iso-8859) 100%兼容存储在utf8数据存储中。所有ascii和扩展ascii字符将存储为单字节。
反之,从utf8到Latin1字符集可能工作,也可能不工作。如果有任何2字节字符(超出扩展ascii 255的字符),它们将不会存储在Latin1数据存储中。
其他回答
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'
UTF-8是一种多字节编码,可以表示任何Unicode字符。ISO 8859-1是一种单字节编码,可以表示Unicode的前256个字符。两者都以完全相同的方式编码ASCII。
维基百科解释得很好:UTF-8 vs Latin-1 (ISO-8859-1)。前者为变长编码,后者为单字节定长编码。 Latin-1只编码Unicode字符集的前256个码位,而UTF-8可用于编码所有码位。在物理编码级别,只有码点0 - 127编码相同;编码点128 - 255的不同之处在于,使用UTF-8时会变成2字节序列,而使用Latin-1时会变成单字节序列。
从另一个角度来看,unicode和ascii编码都无法读取的文件,因为其中有一个字节0xc0,似乎可以被iso-8859-1正确读取。需要注意的是,文件中当然不应该包含unicode字符。
UTF
UTF是一组多字节编码方案,它可以表示最多2^31个[大约20亿]字符的Unicode码位。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年解散,将维护工作留给其母小组委员会。
Windows代码页
值得一提的是,微软还维护了一组与ISO-8859有有限兼容性的字符编码,通常记为“cp####”。MS似乎在推动他们最近发布的产品以一种或另一种形式使用Unicode,但是由于遗留和/或互操作性的原因,您仍然可能遇到它们。
例如,cp1252是ISO-8859-1的超集,包含0x80-0x9F范围内的额外可打印字符,特别是欧元符号€和备受诟病的“智能引号”“”。这经常会导致不匹配,8859-1可以完全正常地显示为1252,而1252似乎可以正常地显示为8859-1,但当其中一个额外的符号出现时,就会出现错误。
除了cp1252,土耳其的cp1254是类似于ISO-8859-9的超集,但所有其他Windows代码页至少有一些基本的冲突,如果不是完全不同于他们的8859等效。
推荐文章
- 将Unicode文本写入文本文件?
- PHP DOMDocument loadHTML没有正确编码UTF-8
- 什么是ANSI格式?
- 如何在Bash中回显4位Unicode字符?
- UTF-8字节[]到字符串
- 什么是垂直标签?
- Python字符串中的u'\ufeff'
- 如何转换字符串和从UTF8字节数组在Java
- 如何在资源包的资源属性中使用UTF-8
- utf - 8:将军?本吗?Unicode吗?
- 如何检查字符串是否为unicode或ascii?
- “不正确的字符串值”时,试图插入UTF-8到MySQL通过JDBC?
- 有一个上下颠倒的插入符号吗?
- 检测编码并使所有内容都为UTF-8
- 'utf-8' codec不能解码字节0xff在位置0:无效的开始字节