python - 在python 3中将表情符号转换为Unicode,反之亦然

我正在尝试在 python 3 中将表情符号转换为其 Unicode。例如,我将拥有表情符号?,并希望从中获得相应的 unicode 'U+1F600'。同样,我想将“U+1F600”转换回?。现在我已经阅读了文档并尝试了几个选项,但这里的 python 行为让我感到困惑。

>>> x = '?'
>>> y = x.encode('utf-8')
>>> y
b'\xf0\x9f\x98\x80'

表情符号被转换为字节对象。

>>> z = y.decode('utf-8')
>>> z
'?'

将字节对象转换回表情符号,到目前为止一切顺利。

现在,获取表情符号的 unicode:

>>> c = '\U0001F600'
>>> d = c.encode('utf-8')
>>> d
>>> b'\xf0\x9f\x98\x80'

这会再次打印出字节编码。

>>> d.decode('utf-8')
>>> '?'

这会再次打印表情符号。我真的不知道如何仅在 Unicode 和表情符号之间进行转换。

最佳答案

'?' 已经是一个 Unicode 对象。 UTF-8 不是 Unicode,它是 Unicode 的字节编码。要获取 Unicode 字符的代码点编号,可以使用 ord 函数。并以您想要的形式打印它,您可以将其格式化为十六进制。像这样:

s = '?'
print('U+{:X}'.format(ord(s)))

输出

U+1F600

如果你有 Python 3.6+,你可以使用 f-string 使它更短(更高效):

s = '?'
print(f'U+{ord(s):X}')

顺便说一句,如果您想创建像 '\U0001F600' 这样的 Unicode 转义序列,则可以使用 'unicode-escape' 编解码器。但是,它返回一个 bytes 字符串,您可能希望将其转换回文本。您可以为此使用“UTF-8”编解码器,但也可以只使用“ASCII”编解码器,因为它保证只包含有效的 ASCII。

s = '?'
print(s.encode('unicode-escape'))
print(s.encode('unicode-escape').decode('ASCII'))

输出

b'\\U0001f600'
\U0001f600

我建议你看看 Stack Overflow 联合创始人 Joel Spolsky 的这篇短文 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) .

https://stackoverflow.com/questions/47716217/

相关文章:

emacs - 在 LaTeX 模式 emacs 中缩进 C 代码区域

formatting - JSON.Net 将 XML 序列化为 JSON 驼峰式案例

javascript - 如何使用变量名实现字符串格式化程序

sql - 在 Oracle 中将时差转换为给定格式

formatting - Gnuplot 平滑置信区间线而不是误差线

forms - 如何在 Laravel 中处理日期输入

python - 在没有空格或换行符的python中打印变量

java - 在字符串模板电子邮件中格式化日期

ios - iPhone : How to get number from string with

c# - DataGridViewCheckBoxColumn : FormatException