Python的Unicode码点转换为Unicode字符

27

我想要把一些中文、俄文或其他非英语字符集写入到一个平面文件中用于测试目的。我遇到了一个问题,如何将Unicode十六进制或十进制值输出为相应的字符。

例如,在Python中,如果您有一个硬编码的字符集像абвгдежзийкл,您可以将其赋值为value = u"абвгдежзийкл",没有问题。

然而,如果您只有一个单个的十进制或十六进制数,比如1081/0439存储在一个变量中,并且希望打印出相应的实际字符(而不仅仅是输出0x439),该怎么办呢?上面的Unicode十进制/十六进制值指的是й


您可能需要修改问题的标题。它提到了UTF-8,但问题与UTF-8无关。 - NPE
2
你不断提到“十进制或十六进制”,让我觉得你忽略了一个事实,那就是“十进制或十六进制”只是表示方式,而不是值本身的属性。 - glglgl
4个回答

37

Python 2:使用unichr()函数:

>>> print(unichr(1081))
й

Python 3: 使用chr()函数:

>>> print(chr(1081))
й

谢谢你的回答,虽然不是我正在寻找的,因为我已经知道如何处理硬编码条目。我想知道如何处理变量中的十进制或十六进制Unicode值以进行标准输出或输出到文件。 - stoneferry
@stoneferry:只需将“1081”更改为包含字符代码的变量名称即可。 - NPE
如果我有一个只包含整数'1081'的变量,例如如何使用打印命令输出字符而不仅仅是'1081'。 - stoneferry
4
如果您的变量是一个表示数字的十六进制形式的字符串,您可以使用 int(var, 16) 将其转换为整数。例如,int('0x0439', 16) 将得到 1081 - Nathan Craike
2
注意:unichr仅适用于Python 2。在Python 3中,您可以直接使用chr - Martin Thoma

10

所以这个问题的答案是:

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

总之:

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

2
如果您明确指定了进制,那么0x是可选的。例如,chr(int('897F', 16))也可以正常工作。 - ccpizza
为什么 chr(0x897F) 可以正常工作?0x897F 是一个整数字面值。https://docs.python.org/3/reference/lexical_analysis.html#integer-literals - FlipMcF

3
在处理一项包含解析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?

0
如果你遇到以下错误:

ValueError: unichr() arg not in range(0x10000) (narrow Python build)

在尝试使用 unichr 转换十六进制值时,你可以通过以下方式解决该错误:
>>> n = int('0001f600', 16)
>>> s = '\\U{:0>8X}'.format(n)
>>> s
'\\U0001F600'
>>> binary = s.decode('unicode-escape')
>>> print(binary)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接