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

时间:2010-04-01 18:28:29

标签: python encoding string utf-8

它在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 :(得分:7)

我们需要以下内容,我们需要完全输出:

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

repr(sourceresult.sourcename)

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

也许this可能会有所帮助。

编辑:您的sourceresult.sourcename似乎编码为cp1252。我不知道mystring(你在评论中提到的)是什么。 因此,要获得UTF-8编码的字符串,您需要执行以下操作:

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

但是,cp1252编码的字符串与您提供的错误消息一致。

答案 1 :(得分:0)

“无效数据”通常表示传入数据包含字符集之外的字符。

这通常是由某些时候某些数据以不同于UTF-8的字符集编码而引起的。

例如,当您将UTF-8作为标准字符集时,如果存储字符串的文件未转换为UTF-8。 (在Windows中,您通常可以在文本编辑器的“另存为...”对话框中指定文件的编码)

或者,当数据来自在表,连接或两者中使用不同字符集的数据库时。

查看数据的来源以及沿途设置的编码。

答案 2 :(得分:0)

我认为问题在于你使用了str()函数。请记住,str()返回的是窄字符,即每字符1个字节的字符串。如果输入sourceresult.sourcename是unicode,那么Python会自动对其进行编码以返回一个窄字符串。默认情况下,它使用系统编码(可能类似于ISO-8859-1)来执行此操作。

所以你得到了错误,因为在已经编码的字符串上调用encode是没有意义的。如果你摆脱str(),它应该工作。

答案 3 :(得分:0)

确保varchar字段中没有奇数个字节;当有人用阿拉伯语输入长字符串时,我有一个varchar(255)爆炸了。然后我得到了“意外的数据结束”错误(正如人们所预料的那样......!)