Python UTF-8 在32位机器上无法解码字节

4 投票
4 回答
17441 浏览
提问于 2025-04-15 21:08

在64位的机器上运行得很好,但不知道为什么在32位的环境下用Python 2.4.3就不行。

我遇到了这个错误:

'utf8' codec can't decode bytes in position 76-79: invalid data

对于这段代码:

try:        
    str(sourceresult.sourcename).encode('utf8','replace')
except:
    raise Exception(  repr(sourceresult.sourcename ) )

它返回了'kazamidori blog\xf9'

我已经修改了我的site.py文件,把UTF8设置为默认编码,但似乎还是不行。

4 个回答

0

我觉得问题出在你使用的str()函数上。要知道,str()会返回一种窄字符串,也就是每个字符占用1个字节的字符串。如果输入的sourceresult.sourcename是unicode格式,那么Python会自动对它进行编码,以返回一个窄字符串。默认情况下,它使用系统的编码方式,这通常是像ISO-8859-1这样的编码。

所以你会遇到错误,是因为在一个已经被编码的字符串上再调用encode是没有意义的。如果你去掉str(),应该就能正常工作了。

0

"无效数据"通常意味着传入的数据包含了一些不在其字符集范围内的字符。

这通常是因为在某个环节,数据使用了与UTF-8不同的字符集进行编码。

举个例子,如果你存储字符串的文件在你将UTF-8设为标准字符集时没有转换成UTF-8格式。(在Windows系统中,你通常可以在文本编辑器的“另存为...”对话框中指定文件的编码方式)

或者,当数据来自一个使用不同字符集的数据库时,可能是表格、连接,或者两者都有问题。

你需要检查一下数据的来源,以及在这个过程中设置了哪些编码。

7

我们需要以下内容,并且需要完全一样的输出:

type(sourceresult.sourcename) # I suspect it's already a UTF-8 encoded string

repr(sourceresult.sourcename)

就像我说的,我几乎可以肯定你的 sourceresult.sourcename 已经是一个UTF-8编码的字符串了。

也许 这个链接可能会对你有一点帮助。

补充:看起来你的 sourceresult.sourcename 是用cp1252编码的。我不知道你在评论中提到的 mystring 是什么。

所以,要得到一个UTF-8编码的字符串,你需要这样做:

source_as_UTF8= sourceresult.sourcename.decode("cp1252").encode("utf-8")

不过,字符串是用cp1252编码的这一点和你提供的错误信息并不一致。

撰写回答