首页 > 解决方案 > 当 UTF 是多字节且 latin1 是单字节时,为什么会出现错误?

问题描述

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

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

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

提前致谢。

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

标签: pythonpandasencodingutf-8

解决方案


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

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

Latin-1 解码所有内容,因为 latin-1 与大多数每个字符 ASCII 超集编码一个字节一样,是愚蠢的。它只是将每个字节值映射到单个字符(在 latin-1 的情况下等效的 Unicode 序数)。所以无论你扔什么垃圾,latin-1 都会对其进行解码,但结果也将是垃圾,除非文本实际上latin-1(或 ASCII,latin-1 是其超集)。这就是为什么每个字符一个字节的 ASCII 超集通常是一个坏主意。如果您使用 Windows 语言环境选择的 ASCII 超集,那么它可以在您的机器和具有相同语言环境的任何其他人的机器上工作,但是一旦它被加载到不同语言环境的机器上,它们就会默默地得到垃圾。

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


推荐阅读