【问题标题】:UnicodeDecodeError: 'utf8' codec can't decode byte "0xc3"UnicodeDecodeError:“utf8”编解码器无法解码字节“0xc3”
【发布时间】:2013-08-23 22:05:36
【问题描述】:

在 python 2.7 中我有这个:

# -*- coding: utf-8 -*-
from nltk.corpus import abc
with open("abc.txt","w") as f:
    f.write(" ".join(i.words()))

然后我尝试在 Python 3 中阅读此文档:

 with open("abc.txt", 'r', encoding='utf-8') as f:
     f.read()

只为得到:

  File "C:\Python32\lib\codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 633096: invalid continuation byte

我做错了什么? Notepad++ 似乎表明该文档是 Unicode utf-8。即使我尝试使用 Notepad++ 将文档转换为这种格式,我仍然在 python 3 中收到此错误,这很奇怪,因为我阅读了许多其他 utf-8 编码的文档而没有任何问题。

【问题讨论】:

  • od 对那个位置周围的字符有什么看法?

标签: python


【解决方案1】:

我的猜测是您的输入被编码为 ISO-8859-2,其中包含 Ă0xC3。检查输入文件的编码。

【讨论】:

  • Notepad++ 说文档编码为 UTF8 没有 BOM
  • @Baz Notepad++ 可能猜错了。 没有可靠的方法来猜测编码。每个程序有时都会猜到错误的编码,这就是为什么您应该始终知道文件的编码。尝试重写文件,使编码为 utf-8 显式(例如,使用codecs.open 而不是open)。
【解决方案2】:

基于您的 Python 2.7 没有引发异常这一事实,我推断i.words() 返回一个字节串序列。这些不太可能以 UTF8 编码 - 我猜可能是 Latin-1 或类似的东西。然后将它们写入文件。此时不会发生编码。

您可能需要将它们转换为 unicode 字符串,您需要知道它们现有的编码,然后在写入文件时需要将它们编码为 UTF-8。

例如:

# -*- coding: utf-8 -*-
from nltk.corpus import abc
import codecs
with codecs.open("abc.txt","w","utf-8") as f:
    f.write(u" ".join(codecs.decode(word,"latin-1") for word in i.words()))

一些进一步的说明,以防有任何混淆:

  • -*- coding: utf-8 -*- 行指的是用于编写 Python 脚本本身的编码。它对该脚本的输入或输出没有影响。
  • 在 Python 2.7 中,有两种字符串:字节字符串,它是具有未指定编码的字节序列,以及 unicode 字符串,它是 unicode 代码点序列。字节串是最常见的,如果您使用常规的"abc" 字符串文字语法,您就会得到。当您使用 u"abc" 语法时,您会得到 Unicode 字符串。
  • 在 Python 2.7 中,如果只使用 open 函数打开文件并将字节串写入其中,则不会发生编码。字节串的字节直接写入文件。如果您尝试向其写入 unicode 字符串,如果它们包含默认 (ASCII) 编解码器无法编码的字符,则会出现异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2011-08-20
    相关资源
    最近更新 更多