UnicodeDecodeError: 'utf8'编解码器无法解码字节"0xc3"。

11
在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 会告诉我们该位置周围的字符是什么? - Ignacio Vazquez-Abrams
2个回答

4
我的猜测是您的输入内容采用了ISO-8859-2编码,其中包含Ă,对应的16进制编码是0xC3。请检查您输入文件所使用的编码。

Notepad++显示该文档以UTF8无BOM编码保存。 - Baz
13
@Baz Notepad++ 可能会猜错编码。没有可靠的方式来猜测编码。每个程序有时都会猜错编码,这就是为什么你应该始终知道文件的编码。尝试重新编写文件,显式地将编码设置为 utf-8(例如使用 codecs.open 而不是 open)。 - Bakuriu

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字符串则是由Unicode代码点序列组成的。字节串最常见,如果使用常规的"abc"字符串文字语法,则会得到字节串。当使用u"abc"语法时,将得到Unicode字符串。
  • 在Python 2.7中,如果只使用open函数打开文件并将字节串写入其中,则不会进行编码。字节串的字节直接写入文件中。如果尝试将Unicode字符串写入其中,并且它们包含不能被默认(ASCII)编解码器编码的字符,则会出现异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接