Python 的 UTF-8 处理

0 投票
2 回答
1487 浏览
提问于 2025-04-16 01:35

我正在使用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

我不明白为什么从文件中读取相同的数据会出现问题。有没有人能解释一下为什么会这样,以及我该如何解决这个问题?

提前谢谢大家!

2 个回答

1

codecs.open 返回的是一个对象,这个对象的 read 方法会给你一个 unicode 字符串,而不是编码后的字节字符串——这就是 codecs.open 函数的主要目的。所以,当你用 print (data) 打印的时候,结果会和你之前用 print (bDATA) 打印的完全不同:后者打印的是 utf-8 编码的字节字符串,而前者则是在尝试打印 unicode 对象(这可能在你的环境中会有问题,但如果你在设置为 utf-8 编码的 Terminal.app 中,应该是没问题的)。

不过,你的问题其实在更早的时候就出现了:通过 codecs 生成的类文件对象指出,第 55 到 57 个字节不是有效的 utf-8 编码。要检查这一点,可以用类似下面的方式...:

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

我还会显示一些前后的字节,以便提供上下文。如果你这样做并更新你的问题来展示结果,我们可能就能猜出你的文件实际上是什么编码(目前唯一可以确定的是,它不是 utf-8 编码)。

2

看起来你的文件内容不是用UTF-8编码的。你确定没有用其他编码格式保存吗?当你用cat命令查看文件时,终端显示的是?而不是é,这也说明文件可能有编码问题,因为你的终端似乎是用UTF-8编码的。

另外,你有两个文件,btvresp1.txtbtvresp2.txt。你确定你在使用正确的那个文件吗?

撰写回答