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

时间:2019-07-15 13:39:19

标签: python pandas encoding utf-8

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

  

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

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

谢谢。

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

1 个答案:

答案 0 :(得分:4)

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编码,或者已损坏。 You need to figure out what it really is