我正在尝试制作一个程序来迭代日文字符(Python 2.7)并以可打印格式返回/生成它们,但是我无法将十六进制数字(3040-309f)转换为可以打印字符的格式。我发现使用u'\ u'有效,但当我尝试使用unicode('\ u3040')将数字转换为该格式时,它与u'\ u3040'不同。代码更好地解释了它。
>>> s1 = u'\u309d'
>>> s2 = unicode("\u209d")
>>> print type(s1) == type(s2)
True
>>> print s1 == s2
False
>>> print s1, s2
ゝ \u209d
我尝试将s2
用作UTF-8和latin-1作为第二个参数,但它没有做任何事情。另外,我发现您可以执行u'\u{0}'.format(u'3040')
,但我无法在迭代器中生成u'3040'
,u'\u{0}'.format(unicode('3040')
会引发错误。
答案 0 :(得分:3)
在字节字符串文字中,\uhhhh
转义序列未被解释,因此您将获得6个字符的字面值。
将其转换为Unicode只会将字符串解码为ASCII数据,而不是Python转义序列。
您可以使用unicode_escape
编码进行解码:
>>> "\u209d".decode('unicode_escape')
u'\u209d'
>>> print "\u209d".decode('unicode_escape')
然而,这有几个缺点。任何其他\
转义序列也被解码:
>>> '\\n'
'\\n'
>>> '\\n'.decode('unicode_escape')
u'\n'
所以你可能不得不首先用双倍的反斜杠替换反斜杠,然后保留这些反斜杠:
>>> '\\n'.replace('\\', '\\\\').decode('unicode_escape')
u'\\n'
但非常小心您实际上并未尝试将 JSON数据视为Python字符串文字。 JSON 也使用相同的转义序列格式,但应该被视为JSON;使用json.loads()
进行解码:
>>> import json
>>> json.loads('"\u209d"')
u'\u209d'