【发布时间】:2022-01-11 12:51:25
【问题描述】:
不是编码专家,正在努力学习。
我有一个拉丁编码的文件,当我尝试使用“utf-8”读取和解码时,我收到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 0: invalid start byte
为什么 utf-8(每个字符使用 1-4 个字节)不能解码 latin1(每个字符 1 个字节)。
latin1 是 utf-8 的子集吗?我对此很迷茫,所以任何事情都有帮助。
【问题讨论】:
-
UTF-8 具有某些 规则,任何字节序列都需要遵循这些规则才能成为有效的 UTF-8。独立的
A0已经违反了这些规则。见What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。 -
Unicode 是 ISO-8859 字符集的超集,但 UTF-8 是所有 Unicode 的多字节编码,而 ISO-8859 是单字节编码只是 Unicode 的前 256 个代码点。因此,UTF-8 需要两个字节来编码该范围内的非 ASCII 字符。
-
也就是说,latin1 不是 utf-8 的子集,但它编码的 characters 集合是 Unicode 的子集。字符集与其字节编码之间的区别是单字节编码方案容易模糊的。
-
感谢您的所有回答!将它们作为回复提交,以便我可以将它们视为有效?
-
注意:“utf-8”是原始字节的格式,不是目的地。 Python 在内部使用“增强的 Unicode 字符集”(将其视为黑盒,真正的编码是“可变的”,但除非您正在为 Python 做 C 模块,否则您不应该关心它)。