一段时间以来,我一直在思考这个问题,我已经阅读了很多文章,但这个问题并没有变得更清楚。我的数据库中存储了一堆字符串,想象一下:
x = '\xd0\xa4'
y = '\x92'
在 Python shell 中,我得到以下信息:
print x
Ф
print y
?
这正是我想看到的。然而,还有以下内容:
print unicode(x, 'utf8')
Ф
但不是这个:
unicode(y, 'utf8')
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 0: unexpected code byte
我的感觉是我们的字符串被破坏了,因为 Django 试图将它们转换为 unicode,但我只是在猜测这一点。任何见解或解决方法表示赞赏。
更新:当我查看数据库中包含 '\x92' 值的行时,我看到这个字符为 '。撇号。我正在使用 Unicode UTF-8 编码查看数据库的内容。
请您参考如下方法:
看起来你有错字;应该是 x = '\xd0\xa4'。如果您使用实际运行的内容和输出中出现的内容的复制粘贴,这将非常有帮助。
"\x92"不是有效的 UTF-8 字符串。这解释了您遇到的异常。
更令人困惑的是为什么 print y 产生了 ?。你叫什么“Python控制台”?它似乎在“替换”模式下运行并替换“?” ...你确定这是一个普通的“?”而不是白色的“?”在黑钻石里面?为什么说那个“?”正是您期望看到的?
更新:您现在说“””当我查看数据库中包含 '\x92' 值的行时,我将此字符视为 '。一个撇号。我正在查看使用 Unicode UTF-8 编码的数据库内容。"""
那不是撇号。似乎那段数据已使用 cp125X(又名 windows-125X)编码之一进行了编码。使用 cp1252(通常的嫌疑人)进行说明:
IDLE 2.6.4
>>> import unicodedata
>>> uc = '\x92'.decode('cp1252')
>>> print repr(uc)
u'\u2019'
>>> print uc
’
>>> unicodedata.name(uc)
'RIGHT SINGLE QUOTATION MARK'
>>>
与其“使用 Unicode UTF-8 编码查看数据库的内容”(不管那是什么意思),不如尝试编写一小段 Python 代码来提取有问题的字符串,然后执行 print repr(bad_string) 。向我们展示您运行的代码,以及 repr() 的输出。还要告诉我们哪个版本的 Python、什么平台(基于 Windows 或 unix)以及什么版本的数据库软件。以及与相关列相关的 CREATE TABLE 语句部分。
