将十六进制字符串转换为unicode字符串(python)

时间:2017-08-21 14:37:03

标签: python python-2.7 unicode

我有一串unicode序列(十六进制形式),如下所示:

\u063a\u064a\u0646\u064a\u0627

这是阿拉伯字符串غينيا的unicode repsentation(得到了阿拉伯语lorem ipsum生成器)。

我想将unicode十六进制字符串转换为غينيا。我试过print u'%s' % "\u063a\u064a\u0646\u064a\u0627"(指出here),但这只是返回十六进制格式,而不是符号。 print word.replace("\u","\\u")也不能胜任这项工作。怎么办?

1 个答案:

答案 0 :(得分:1)

我不完全确定你想要什么,所以我将涵盖我能看到的两种情况。

案例1:您只想使用unicode文字语法从代码中输出阿拉伯字符串。在这种情况下,你应该在你的字符串文字前面添加一个u,你就像雨一样正确:

s = u"\u063a\u064a\u0646\u064a\u0627"
print(s)

这可能和

一样
print u'%s' % s

除了更短。在这种情况下,将其他空字符串格式化为您形成的字符串没有任何意义,因为它没有改变任何东西 - 换句话说,u'%s' % s == s

案例2:您有一个其他来源的转义字符串,您要将其评估为Unicode字符串。这就是你试图用print u'%s' %做的事情。这可以通过

完成
import ast
s = r"\u063a\u064a\u0646\u064a\u0627"
print ast.literal_eval("u'{}'".format(s))

请注意,与eval不同,这是安全的,因为literal_eval不允许任何类似函数调用。另请注意,这里的s是一个带有r前缀的字符串,因此反斜杠不会转义任何内容,而是字面上的反斜杠字符。

两段代码都正确输出

غينيا

对案例1的print u'%s' % s进行了一些阐述。这种行为有所不同,因为如果字符串已经被转义,它将不会像格式化中的Unicode文字一样被评估。这是因为Python在初次评估时实际上只是从类似unicode文字的表达式(例如s)中构建Unicode。如果它已被转义,则使用普通的字符串操作是不可能实现的,因此您必须使用literal_eval再次评估它 才能正确打印字符串。当你运行

print u'%s' % s

输出

\u063a\u064a\u0646\u064a\u0627

请注意,这不是Unicode对象的表示,而是字面上的带有一些反斜杠和字符的ascii字符串。