22

我正在尝试将一些中文、俄文或各种非英文字符集写入平面文件以进行测试。我陷入了如何将 Unicode 十六进制或十进制值输出到其相应字符的问题上。

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

但是,如果您将一个十进制或十六进制十进制(如 1081 / 0439)存储在一个变量中,并且您想用它对应的实际字符(而不仅仅是输出 0x439)将其打印出来,该怎么做?上面的 Unicode 十进制/十六进制值是指й.

4

4 回答 4

34

Python 2:使用unichr()

>>> print(unichr(1081))
й

Python 3:使用chr()

>>> print(chr(1081))
й
于 2012-05-23T07:53:41.150 回答
7

所以这个问题的答案是:

  1. 将十六进制值转换为十进制int(hex_value, 16)
  2. 然后用 得到对应的字符串chr()

总结一下:

>>> print(chr(int('0x897F', 16)))
西
于 2017-03-16T16:46:56.960 回答
2

在处理包含解析一些 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?
于 2020-12-07T20:32:28.923 回答
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)

于 2017-12-08T22:37:34.047 回答