Python UTF-8转换问题

时间:2011-05-18 20:36:53

标签: python django unicode encoding utf-8

在我的数据库中,我存储了一些UTF-8字符。例如。 “名称”字段中的“α”

通过Django ORM,当我读出来的时候,我得到的东西就像

>>> p.name
u'\xce\xb1'
>>> print p.name
α

我希望'α'。

经过一番挖掘,我想如果我做了

>>> a = 'α'
>>> a
'\xce\xb1'

所以当Python试图显示'\ xce \ xb1'时我会得到alpha,但是当它试图显示你'\ xce \ xb1'时,它是双重编码?

为什么我首先得到你'\ xce \ xb1'?有没有办法可以回到'\ xce \ xb1'?

感谢。我的UTF-8和unicode处理知识确实需要一些帮助...

5 个答案:

答案 0 :(得分:2)

尝试将unicode签名u放在字符串之前,例如u'YOUR_ALFA_CHAR'并修改数据库编码,因为Django始终支持UTF-8。

答案 1 :(得分:2)

您似乎拥有的是UTF-8编码字符串的各个字节,这些字符串被解释为unicode代码点。你可以用这个奇怪的形式“解码”你的字符串:

p.name = ''.join(chr(ord(x)) for x in p.name)

或者

p.name = ''.join(chr(ord(x)) for x in p.name).decode('utf8')

将字符串“编码”成这种形式的一种方法是

''.join(unichr(ord(x)) for x in '\xce\xb1')

虽然我有一种感觉,你的字符串实际上是由你的系统的不同组件处于这种状态而不同意使用的编码。

您可能必须修复不良“编码”的来源,而不仅仅是修复当前数据库中的数据。上面的代码可能可以将您的错误数据转换一次,但我建议您不要将此代码插入到您的Django应用程序中。

答案 2 :(得分:1)

问题是p.name未正确存储和/或从数据库中读入。

Unicode小alpha是U + 03B1,p.name应该打印为u'\ x03b1',或者如果你使用的是支持Unicode的终端,则实际的alpha符号本身可能已用引号打印。注意u'\ xce \ xb1'和u'\ xceb1'之间的区别。前者是两个字符的字符串,后者是单个字符串。我不知道UTF-8的'03'字节是如何被翻译成'CE'的。

答案 3 :(得分:0)

尝试使用p.name.encode('latin-1')转换编码。这是一个演示:

>>> print u'\xce\xb1'
α
>>> print u'\xce\xb1'.encode('latin-1')
α
>>> print '\xce\xb1'
α
>>> '\xce\xb1' == u'\xce\xb1'.encode('latin1')
True

有关详细信息,请参阅str.encodeStandard Encodings

答案 4 :(得分:0)

您可以通过解码函数将任何字节序列转换为内部unicode表示:

print '\xce\xb1'.decode('utf-8')

这允许您从任何源导入字节序列,然后将其转换为Python unicode字符串。

参考:http://docs.python.org/library/stdtypes.html#string-methods