Python UTF-8 在32位机器上无法解码字节
在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 个回答
我觉得问题出在你使用的str()函数上。要知道,str()会返回一种窄字符串,也就是每个字符占用1个字节的字符串。如果输入的sourceresult.sourcename是unicode格式,那么Python会自动对它进行编码,以返回一个窄字符串。默认情况下,它使用系统的编码方式,这通常是像ISO-8859-1这样的编码。
所以你会遇到错误,是因为在一个已经被编码的字符串上再调用encode是没有意义的。如果你去掉str(),应该就能正常工作了。
"无效数据"通常意味着传入的数据包含了一些不在其字符集范围内的字符。
这通常是因为在某个环节,数据使用了与UTF-8不同的字符集进行编码。
举个例子,如果你存储字符串的文件在你将UTF-8设为标准字符集时没有转换成UTF-8格式。(在Windows系统中,你通常可以在文本编辑器的“另存为...”对话框中指定文件的编码方式)
或者,当数据来自一个使用不同字符集的数据库时,可能是表格、连接,或者两者都有问题。
你需要检查一下数据的来源,以及在这个过程中设置了哪些编码。
我们需要以下内容,并且需要完全一样的输出:
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编码的这一点和你提供的错误信息并不一致。