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 编码的文档而没有任何问题。

4

2 回答 2

4

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

于 2013-08-23T13:25:06.313 回答
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 中,有两种字符串:bytestrings,它是具有未指定编码的字节序列,和 unicode strings,它是 unicode 代码点序列。字节字符串是最常见的,如果您使用常规"abc"字符串文字语法,您就会得到。Unicode 字符串是您使用u"abc"语法时得到的。
  • 在 Python 2.7 中,如果您只是使用 open 函数打开一个文件并向其写入字节串,则不会发生编码。字节串的字节被直接写入文件。如果您尝试向其写入 unicode 字符串,如果它们包含默认 (ASCII) 编解码器无法编码的字符,则会出现异常。
于 2013-08-23T13:38:43.983 回答