dno*_*len 1 python django unicode
一直在敲我的脑袋一段时间,我读了一堆文章,问题并没有更明确.我有一堆字符串存储在我的数据库中,想象如下:
x = '\xd0\xa4'
y = '\x92'
Run Code Online (Sandbox Code Playgroud)
在Python shell中,我得到以下内容:
print x
?
print y
?
Run Code Online (Sandbox Code Playgroud)
这正是我想要看到的.然而,有以下内容:
print unicode(x, 'utf8')
?
Run Code Online (Sandbox Code Playgroud)
但不是这个:
unicode(y, 'utf8')
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 0: unexpected code byte
Run Code Online (Sandbox Code Playgroud)
我的感觉是我们的字符串被破坏了,因为Django试图将它们转换为unicode,但我只是在猜测这一点.任何见解或变通方法都表示赞赏.
更新:当我查看包含'\ x92'值的行的数据库时,我将此字符视为'.撇号.我正在使用Unicode UTF-8编码查看数据库的内容.
看起来你有一个错字; 应该是x = '\xd0\xa4'.如果您使用实际运行的内容和输出中出现的内容的复制粘贴,它会非常有用.
"\ x92"不是有效的UTF-8字符串.这解释了你得到的例外情况.
更多的谜题是print y产生的原因?.你叫什么叫"Python控制台"?它似乎是在"替换"模式下运行而代以"?" ......你确定这是一个简单的"?" 而不是白色的"?" 黑钻里面?为什么这么说"?" 正是你期望看到的?
更新:您现在说""当我在包含'\ x92'值的行查看数据库时,我将此字符视为'.撇号.我正在使用Unicode UTF查看数据库的内容8编码."""
那不是撇号.看来这段数据是使用cp125X(aka 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'
>>>
Run Code Online (Sandbox Code Playgroud)
而不是"使用Unicode UTF-8编码查看数据库的内容"(无论这意味着什么),尝试编写一小段Python代码来提取有问题的字符串然后执行print repr(bad_string).向我们展示您运行的代码,以及repr()的输出.还告诉我们哪个版本的Python,什么平台(基于Windows或unix),以及什么版本的数据库软件.并且CREATE TABLE语句的一部分与相关列相关.
小智 5
\x92 不是有效的utf-8编码字符.
您没有注意到,因为您使用简单(非unicode)字符串x,y直到您尝试将它们解码为unicode字符串.然后当你打印它们时,它们被简单地"原样"转储到终端,终端本身根据其编码设置解释字节.
有一个第三个参数unicode()告诉python在编码(解码)错误的情况下该怎么做:
>>> unicode('\x92', 'utf8', 'replace')
u'\ufffd'
>>> print _
?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4843 次 |
| 最近记录: |