我有一串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")
也不能胜任这项工作。怎么办?
答案 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字符串。