我想知道如何在Python中获得像سلام
这样的阿拉伯字符串的Unicode表示形式?如何获取Django中的阿拉伯字符串的Unicode表示形式?
结果应该是\u0633\u0644\u0627\u0645
我需要的,这样我可以比较来自MySQL数据库和存储在Redis的缓存中的数据检索的文本。
我想知道如何在Python中获得像سلام
这样的阿拉伯字符串的Unicode表示形式?如何获取Django中的阿拉伯字符串的Unicode表示形式?
结果应该是\u0633\u0644\u0627\u0645
我需要的,这样我可以比较来自MySQL数据库和存储在Redis的缓存中的数据检索的文本。
假设你有一个实际的Unicode字符串,你可以做
# -*- coding: utf-8 -*-
s = u'سلام'
print s.encode('unicode-escape')
输出
\u0633\u0644\u0627\u0645
的# -*- coding: utf-8 -*-
指令纯粹是为了告诉解释器的源代码是UTF-8编码,但对脚本本身是如何处理Unicode无关。
如果你的脚本读取从UTF-8编码的来源,阿拉伯语字符串,该字节将是这样的:
\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85
您可以在转换为Unicode是这样的:
data = '\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'
s = data.decode('utf8')
print s
print s.encode('unicode-escape')
输出
سلام
\u0633\u0644\u0627\u0645
当然,您确实需要确保您的终端设置为正确处理Unicode。
注意
'\u0633\u0644\u0627\u0645'
是含有24个字节的纯(字节)字符串,而
u'\u0633\u0644\u0627\u0645'
是含有4个Unicode字符的Unicode字符串。
您可能会发现这篇文章有帮助:Pragmatic Unicode,这是由SO老将Ned Batchelder写的。
在python 2.x中使用u
预先填充字符串,这会使您的字符串成为unicode字符串。然后你可以调用一个unicode字符串的encode
方法。
arabic_string = u'سلام'
arabic_string.encode('utf-8')
输出:
print arabic_string.encode('utf-8')
'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'
这yeilds一个错误:'“ASCII”编解码器不能编码字符在0-3位置:有序不在范围内(128)' – supermario
哪个Python版本您使用的? – JClarke
我正在使用Python 2.7.6 – supermario
对于Python 2.7
string = 'سلام'
new_string = unicode(string)
当我在终端打印'string'时,它仍然是'سلام'。此外,比较不按预期进行。 – supermario
对不起,只是分配它 – Navidad20
由于您使用的是Python 2.x,因此无法使用encode
。您需要使用unicode
函数将字符串转换为unicode对象。
> f='سلام'
> f
'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'
> unicode(f, 'utf-8') # note: you need to pass the encoding parameter in or you'll
# keep having the same problem.
u'\u0633\u0644\u0627\u0645'
> print unicode(f, 'utf-8')
سلام
我不知道您使用的是获取内容是什么库,但你也许可以将数据为Unicode最初取。
> f = u'سلام'
> f
u'\u0633\u0644\u0627\u0645'
> print f.encode('unicode-escape')
\u0633\u0644\u0627\u0645
> print f
سلام
好,虽然这在终端工作,我需要分配输出到一个新的变量。它不能在我的views.py中使用'print'来完成。任何想法来解决这个问题? – supermario
@supermario像这样的东西应该工作:'a = s.encode('unicode-escape')' –