Python 以编程方式将长十六进制字符转换为unicode字符,如表情符号

Python 以编程方式将长十六进制字符转换为unicode字符,如表情符号,python,unicode,Python,Unicode,给定一个包含表情符号十六进制值的变量,如str(例如s='1f602'),如何以编程方式将其作为UTF-8编码的表情符号打印到文件中 不以编程方式执行,但要求源代码中包含代码点本身 我知道这只在Python 3中起作用: import codecs s = '1f602' with codecs.open('test.out', 'w', 'utf-8') as outfile: outfile.write('{}\n'.format(eval('u"{}{}"'.format(r'\U

给定一个包含表情符号十六进制值的变量,如
str
(例如
s='1f602'
),如何以编程方式将其作为UTF-8编码的表情符号打印到文件中

不以编程方式执行,但要求源代码中包含代码点本身

我知道这只在Python 3中起作用:

import codecs
s = '1f602'
with codecs.open('test.out', 'w', 'utf-8') as outfile:
    outfile.write('{}\n'.format(eval('u"{}{}"'.format(r'\U000', text))))
在支持的文本编辑器中打开该文件时,将显示单个表情符号

如何使其在Python2中也起作用,而不使用
eval


我认为
unichr
可以工作,但它只接受小于
0x10000
的unicode字符。这在Python 2和3中都适用。它使用更安全的
ast.literal\U eval
来构建角色,因为正如您所发现的那样,
unichr
在狭窄的Python 2构建中不适用于U+FFFF以上的角色

import ast
import io

s = '1f602'
s2 = "u'\\U{:08X}'".format(int(s,16))
c = ast.literal_eval(s2)
with io.open('test.txt','w',encoding='utf8') as f:
    f.write(c)

您还可以使用UTF-32编码:

import struct

def fullchr(n):
    return struct.pack('<I', n).decode('utf-32le')

outfile.write(fullchr(0x1F602))   # int('1F602', 16)
导入结构
def fullchr(n):

return struct.pack('那么真的没有办法不使用某种评估吗?@justhalf同意bobince的答案。它也可以移植,但速度要快得多。是的,我不知道你可以简单地执行
chr(0x1F602)
在Python 3中。顺便问一下,这是什么
struct
?它是一种将数据打包成二进制结构的方法,可以快速地将整数代码点填充到一个四字节的小端数据结构中,该结构恰好与UTF-32编码指定的格式相同。