当 UTF 是多字节且 latin1 是单字节时,为什么会出现错误?

0 python encoding utf-8 pandas

我正在通过 pandas.read_csv() 读取 CSV 文件。当指定 enconding = UTF-8 或 16 时,会出现错误。

“utf-8”编解码器无法解码位置 127 中的字节 0xa3:起始字节无效

我的疑问是,当UTF是多字节编码而latin1是单字节编码时,为什么我在使用UTF-8或16时会出现错误,但使用latin1却可以正常工作?UTF不应该更优越并且可以解码所有字符吗?

提前致谢。

尝试编码= latin1,'cp1252','iso-8859-15'

Sha*_*ger 6

UTF-8是自同步的;您可以在不检查相邻字符的情况下知道您在多字节字符中的位置。因此,如果在到达起始字节之前到达不是起始字节的字节,您就知道它不是 UTF-8,或者 UTF-8 已损坏。

UTF-8 并不神奇;您可以将任何内容编码为 UTF-8,但只有当您有 UTF-8 字节时才能解码为 UTF-8。

Latin-1 可以解码所有内容,因为与大多数每个字符一个字节 ASCII 超集编码一样,latin-1 是愚蠢的。它只是将每个字节值映射到单个字符(在 latin-1 的情况下相当于 Unicode 序数)。因此,无论您向其中抛出什么垃圾,latin-1 都会对其进行解码,但结果也将是垃圾,除非文本实际上latin-1(或 ASCII,latin-1 是其超集)。这就是为什么每个字符一个字节的 ASCII 超集通常是一个坏主意;如果您使用 Windows 区域设置选择的 ASCII 超集,那么它可以在您的计算机以及具有相同区域设置的其他任何人的计算机上运行,​​但是一旦将其加载到不同区域设置的计算机上,它们就会默默地得到垃圾。

简短回答:您的数据不是 UTF-8 编码的,或者已损坏。你需要弄清楚它到底是什么