Python unicode codepoint to unicode character

时间:2012-05-23 07:52:09

标签: python encoding

我正在尝试用平面文件写出一些中文,俄文或各种非英文字符集用于测试目的。我对如何将Unicode十六进制或十进制值输出到其对应的字符感到困惑。

例如在Python中,如果您有一组硬编码的字符集,例如абвгдежзийкл,您将分配value = u"абвгдежзийкл"并且没有问题。

但是,如果你有一个十进制或十六进制十进制,如1081/0439存储在一个变量中,你想用它的相应实际字符打印出来(而不仅仅是输出0x439),这将如何完成?上面的Unicode十进制/十六进制值是指й

4 个答案:

答案 0 :(得分:20)

Python 2 :使用unichr()

>>> print(unichr(1081))
й

Python 3 :使用chr()

>>> print(chr(1081))
й

答案 1 :(得分:1)

所以问题的答案是:

  1. 使用int(hex_value, 16)
  2. 将十六进制值转换为十进制
  3. 然后使用chr()获得相应的strin。
  4. 总结一下:

    >>> print(chr(int('0x897F', 16)))
    西
    

答案 2 :(得分:0)

如果您遇到错误:

  

ValueError:unichr()arg不在范围内(0x10000)(缩小Python构建)

尝试使用unichr转换十六进制值时,您可以通过执行以下操作来解决该错误:

>>> n = int('0001f600', 16)
>>> s = '\\U{:0>8X}'.format(n)
>>> s
'\\U0001F600'
>>> binary = s.decode('unicode-escape')
>>> print(binary)

答案 3 :(得分:0)

在处理包含解析JSON的项目时,我遇到了类似的问题。我有很多字符串,所有非ASCII字符都这样逃脱了:

>>> print(content)
\u0412\u044B j\u0435\u0441\u0442\u0435 \u0438\u0437 \u0420\u043E\u0441\u0441\u0438\u0438?
...
>>> print(content)
\u010Cemu jesi na\u010Dinal izu\u010Dati med\u017Euslovjansky jezyk?

unichr()逐个符号地转换这样的混合将是乏味的。我最终决定采用的解决方案:

content.encode("utf8").decode("unicode-escape")

第一个操作(编码)产生如下字节串:

b'\\u0412\\u044B j\\u0435\\u0441\\u0442\\u0435 \\u0438\\u0437 \\u0420\\u043E\\u0441\\u0441\\u0438\\u0438?'
b'\\u010Cemu jesi na\\u010Dinal izu\\u010Dati med\\u017Euslovjansky jezyk?'

和第二个操作(解码)将字节字符串转换为Unicode字符串,但用\\替换了\,从而“解包”了字符,给出了如下结果:

Вы jесте из России?
Čemu jesi načinal izučati medžuslovjansky jezyk?