【问题标题】:When UTF is multibyte & latin1 is single byte, why do I get error?当 UTF 是多字节且 latin1 是单字节时,为什么会出现错误?
【发布时间】:2019-07-15 13:39:19
【问题描述】:

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

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

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

提前致谢。

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

【问题讨论】:

  • 并非每个随机字节组合在 UTF-* 中都有效,但任何随机字节在 Latin-1 中都有效。

标签: python pandas encoding utf-8


【解决方案1】:

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

UTF-8 并不神奇;你可以encode几乎任何东西到UTF-8,但是当你有UTF-8字节时你只能decode为UTF-8。

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

简答:您的数据不是 UTF-8 编码的,或者已损坏。 You need to figure out what it really is.

【讨论】:

  • 哇!谢谢。这给了很多清晰度。
  • 作为计算机文本的基础,您应该仅在有 X 个字节时解码为 X。
猜你喜欢
  • 2010-10-19
  • 2011-03-19
  • 2019-06-13
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多