字符串变量中表情符号的 Unicode 不会显示为表情符号



首先,对不起我的英语差而近似...

我正在尝试做一个 Python 脚本,它应该检索一个变量,该变量将代表对应于表情符号 (U000xxxx)的 unicode 代码。 程序这部分的最终目标是以表情符号的名义从 unicode 翻译。

因为我知道在 Python 中显示表情符号是print("U000XXXXX"),所以我在以前的名字之前添加了。 但是当我打印时,最终渲染不是预期的

unicode = "U0001f0cf"
unicode = (f"{unicode}") #OR# unicode = "%s" %unicode
print (unicode) #>>> U0001f0cf
#Expected >>>   

我尝试了很多东西,包括.encode()但 Python 告诉我我不能在字节类型的对象上使用字符串模式(?

这是导致我问题的部分,其余所有过程都可以...... 为了翻译表情符号的名称,从 unicode,我找到了这种方法(从另一个 Stackoverflow 主题制作)

name = emojis.decode(unicode).replace("_"," ").replace(":","")
print(name) #>>> U0001f0cf

而如果我直接输入 unicode 代码,它可以工作......

name = emojis.decode("U0001f0cf").replace("_"," ").replace(":","")
print(name) #>>> :black_joker:

非常感谢任何试图帮助我的人, 祝你晚上愉快

unicode = "U0001f0cf"
unicode = (f"{unicode}")
print(unicode.encode('raw-unicode-escape').decode('unicode-escape'))

这为您提供了而不是U0001f0cf

您对反斜杠的含义感到困惑。在 Python 源代码中,"U0001f0cf"对字符串中的单个字符进行编码。您不能通过在前面添加反斜杠来将九个字符的字符串"U0001f0cf"转换为单个字符,就像在前面连接文字反斜杠会将其转换为换行符一样"n"也不会将其转换为换行符。

您可以轻松做的是删除U并通过chr()将该十六进制数转换为字符。

unicode = "U0001f0cf"
print(chr(int(unicode[1:], 16)))

int("string", base)string转换为指定base中的数字。

首先从变量中获取数字部分,然后使用chr()将其转换为 Unicode 等效项,然后使用unicodedata数据库获取其名称:

import unicodedata as ud
u = 'U0001f0cf'
i = int(u[1:],16)
c = chr(i)
n = ud.name(c)
print(c,n)

输出:

PLAYING CARD BLACK JOKER

您还可以使用范围循环来显示多个表情符号:

import unicodedata as ud
for i in range(0x1f0c1,0x1f0d0):
c = chr(i)
n = ud.name(c)
print(c,n)

输出:

PLAYING CARD ACE OF DIAMONDS
PLAYING CARD TWO OF DIAMONDS
PLAYING CARD THREE OF DIAMONDS
PLAYING CARD FOUR OF DIAMONDS
PLAYING CARD FIVE OF DIAMONDS
PLAYING CARD SIX OF DIAMONDS
PLAYING CARD SEVEN OF DIAMONDS
PLAYING CARD EIGHT OF DIAMONDS
PLAYING CARD NINE OF DIAMONDS
PLAYING CARD TEN OF DIAMONDS
PLAYING CARD JACK OF DIAMONDS
PLAYING CARD KNIGHT OF DIAMONDS
PLAYING CARD QUEEN OF DIAMONDS
PLAYING CARD KING OF DIAMONDS
PLAYING CARD BLACK JOKER

您可以使用ast.literal_eval

我们可以构建一个有效的字符串文字,其中包含 python 的 unicode 转义序列。我们只需要添加".

from ast import literal_eval
user_input = 'U0001f0cf'
emoji_literal = f'"\{user_input}"'
#                 ^              ^
#                here         and here
print(emoji_literal)   # prints "U0001f0cf"
repaired_emoji = literal_eval(emoji_literal)
print(repaired_emoji)  # prints   

emoji_literal包含"U0001f0cf"这正是您没有变量时要输入的内容。

然后ast.literal_eval解释字符串,就好像我们在 python 中将其用作字符串文字一样。

获取Unicode 字符的简单方法是首先包含反斜杠:

unicode = "U0001f0cf"
print (unicode) #>>>   

另一种方式由于使用了eval而更复杂且有点丑陋:

unicode = "U0001f0cf"
unicode = eval(f'"\{unicode}"')
print(unicode) #>>>   

在这种情况下,f'"\{unicode}"'被计算为'"U0001f0cf"',f字符串内的字符串被计算("U0001f0cf"到')。

编辑(因为Tripleee的评论):

eval与用户输入一起使用时不安全,因为用户可以计算任何代码(包括操作系统命令)。 但只要您只为自己使用代码,这不是问题。/<>替代方案是:

  • ast.literal_eval像在袋熊中一样安全评估的答案
  • chr就像Tripleee的回答一样,这是一个非常优雅和合适的解决方案。

相关内容

  • 没有找到相关文章

最新更新