UTF-8和ISO-8859-1有什么区别?
当前回答
还有一件重要的事情需要注意:如果你看到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编码规范(如HTML所使用的)明确声明ISO -8859-1是windows-1252的标签,而web浏览器不以任何方式支持ISO 8859-1: HTML规范说编码规范中的所有编码都必须支持,仅此而已。
同样有趣的是,HTML数字字符引用基本上使用Windows-1252来表示8位值,而不是Unicode代码点;Per https://html.spec.whatwg.org/#numeric-character-reference-end-state, …会产生U+2026而不是U+0085。
其他回答
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 vs Latin-1 (ISO-8859-1)。前者为变长编码,后者为单字节定长编码。 Latin-1只编码Unicode字符集的前256个码位,而UTF-8可用于编码所有码位。在物理编码级别,只有码点0 - 127编码相同;编码点128 - 255的不同之处在于,使用UTF-8时会变成2字节序列,而使用Latin-1时会变成单字节序列。
还有一件重要的事情需要注意:如果你看到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编码规范(如HTML所使用的)明确声明ISO -8859-1是windows-1252的标签,而web浏览器不以任何方式支持ISO 8859-1: HTML规范说编码规范中的所有编码都必须支持,仅此而已。
同样有趣的是,HTML数字字符引用基本上使用Windows-1252来表示8位值,而不是Unicode代码点;Per https://html.spec.whatwg.org/#numeric-character-reference-end-state, …会产生U+2026而不是U+0085。
我研究这个问题的原因是从这个角度,他们在什么方面是兼容的。Latin1字符集(iso-8859) 100%兼容存储在utf8数据存储中。所有ascii和扩展ascii字符将存储为单字节。
反之,从utf8到Latin1字符集可能工作,也可能不工作。如果有任何2字节字符(超出扩展ascii 255的字符),它们将不会存储在Latin1数据存储中。
UTF-8是一种多字节编码,可以表示任何Unicode字符。ISO 8859-1是一种单字节编码,可以表示Unicode的前256个字符。两者都以完全相同的方式编码ASCII。
推荐文章
- 如何在Python中将字符串转换为utf-8
- Unicode和UTF-8的区别是什么?
- 我真的需要将“&”编码为“&”吗?
- 用Python写入UTF-8文件
- HTML编码问题-显示“”字符而不是“ ”
- 将Unicode文本写入文本文件?
- PHP DOMDocument loadHTML没有正确编码UTF-8
- 什么是ANSI格式?
- 如何在Bash中回显4位Unicode字符?
- UTF-8字节[]到字符串
- 什么是垂直标签?
- Python字符串中的u'\ufeff'
- 如何转换字符串和从UTF8字节数组在Java
- 如何在资源包的资源属性中使用UTF-8
- utf - 8:将军?本吗?Unicode吗?