在Python中转换为安全Unicode

2 投票
3 回答
11023 浏览
提问于 2025-04-15 11:38

我正在处理一些未知的数据,想用Python/Django把它们插入到MySQL数据库中。但是我遇到了一些我不太理解的错误,所以想寻求一些帮助。以下是错误信息。

Incorrect string value: '\xEF\xBF\xBDs m...'

我猜可能是字符串没有正确转换为unicode格式?这是我用来进行unicode转换的代码。

s = unicode(content, "utf-8", errors="replace")

如果没有上面的unicode转换,我得到的错误是

'utf8' codec can't decode byte 0x92 in position 31: unexpected code byte. You passed in 'Fabulous home on one of Decatur\x92s most

任何帮助都非常感谢!

3 个回答

1

“Fabulous...”这个字符串看起来不像是utf-8编码的:0x92这个数字大于128,所以它应该是一个多字节字符的一部分。但是在这个字符串中,它单独出现了(显然是表示一个撇号)。

3

0x92在Windows的cp1252编码中是右单引号。

\xEF\xBF\xBD是Unicode替代字符的UTF8编码(这个字符是因为原来的cp1252字符出错而插入的)。

所以看起来你的数据库不接受有效的UTF8数据?

有两个选择: 1. 也许你应该使用unicode(content,"cp1252")。 2. 如果你想把UTF-8数据插入数据库,那么你需要正确配置数据库。我就不多说了,这个问题可以留给更懂的人来回答。

5

原始编码是什么?我猜是“cp1252”,这个是根据pixelbeat的回答来的。如果是这样的话,你可以这样做:

>>> orig # Byte string, encoded in cp1252
'Fabulous home on one of Decatur\x92s most' 

>>> uni = orig.decode('cp1252')
>>> uni # Unicode string
u'Fabulous home on one of Decatur\u2019s most'

>>> s = uni.encode('utf8')  
>>> s # Correct byte string encoded in utf-8
'Fabulous home on one of Decatur\xe2\x80\x99s most'

撰写回答