【问题标题】:Python utf-8 handlingPython utf-8 处理
【发布时间】:2010-07-20 18:21:46
【问题描述】:

我正在使用 Python 2.6.1,并且我的代码遇到了与 utf-8 相关的问题。使用此代码可以重现此问题:

# -*- coding: utf-8 -*-
import os, sys
import string, time
import codecs, re
bDATA='"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankolé","John Hawkes"'
print (bDATA)
fileObj = codecs.open("btvresp1.txt", "r", "utf-8")
data = fileObj.read()
print (data)

bDATA 的第一个打印效果很好。但是,如果文件btcresp1.txt文件中有相同的数据,python会报错如下:

cat btvresp2.txt
"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol?","John Hawkes"

python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> # -*- coding: utf-8 -*-
... 
>>> import os, sys
>>> import string, time
>>> import codecs, re
>>> bDATA='"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol","John Hawkes"'
>>> print (bDATA)
"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol","John Hawkes"
>>> fileObj = codecs.open("btvresp2.txt", "r", "utf-8")
>>> data = fileObj.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py", line 666, in read
    return self.reader.read(size)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py", line 472, in read
    newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 55-57: invalid data

我不确定为什么从文件中读取相同的数据会导致问题。有人可以解释为什么会出现这种行为以及如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • 您确定 btvresp1.txt 文件是 utf-8 编码的吗?

标签: python unicode utf-8 python-2.x


【解决方案1】:

您的文件内容似乎未以 UTF-8 编码。你确定你没有用其他编码保存它吗?当您cat 文件时,终端显示? 而不是é,这也暗示文件中存在编码问题,因为您的终端似乎使用 UTF-8。

您还有两个文件,btvresp1.txtbtvresp2.txt。你用对了吗?

【讨论】:

  • 我的坏.. btvresp1.txt 和 btvresp2.txt 差别很小(我从 bDATA 列表中删除了一些名称)。由于我使用的是 Mac,因此终端应用程序支持 UTF-8,并且能够很好地看到 é。
【解决方案2】:

codecs.open 返回一个对象,其read 方法返回一个unicode 字符串,不是 编码字节字符串——这就是codecs.open 函数的重点.所以,你的print (data),如果你到达它,将与你工作的print (bDATA)完全不同:后者正在打印 utf-8 编码的字节字符串,后者将尝试打印 unicode 对象(取决于您的环境,可能工作也可能不工作——但是,在设置为使用 utf-8 编码的 Terminal.app 上应该没问题)。

但是您的问题出现得更早:编解码器生成的类文件对象断言字节 55 到 57 不是有效的 utf-8 编码。检查这一点的方法类似于...:

>>> f = open("btvresp2.txt", "rb")
>>> print repr(f.read()[50:65])

为了上下文,我还显示了前后几个字节。如果您这样做并编辑您的问题以向我们展示结果,我们可能能够猜出您的文件实际上是什么编码(此时唯一可以确定的是它 not 在 utf- 8编码)。

【讨论】:

  • @Bapatia,带有尖音的小写 e 的 \xe9not utf-8 - 它可能是一些 ISO-8859-x(其中 x 可能是例如 @ 987654330@ 或 15) 或 CP-1252 或类似的东西。尝试使用 iso-8859-1 阅读它,看看会发生什么。
  • 是的!使用 iso-8859-1,我能够正确打印出字符......所以,目前,我使用的框架似乎与 iso-8859-1 存在问题 - 即使我默认为 utf8指定其他编码.. 感谢您的帮助!
猜你喜欢
  • 2020-08-31
  • 2012-07-27
  • 2011-01-22
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2015-04-13
相关资源
最近更新 更多