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

Unicode for an emoji in a string variable isn't shown as the emoji

首先,抱歉我的英语水平很差...

我正在尝试编写一个 Python 脚本,谁应该 检索一个变量 来表示对应于表情符号的 unicode 代码 (U000xxxx)。 这部分程序的最终目标是从 unicode 翻译成表情符号的名称。

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

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

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

这是导致我出现问题的部分,其余过程都正常... 为了从 unicode 翻译表情符号的名称,我找到了这个方法(来自另一个 Whosebug 主题)

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

而如果我直接输入 unicode 代码就可以了...

name = emojis.decode("U0001f0cf").replace("_"," ").replace(":","")
print(name) #>>> :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 在与用户输入一起使用时是不安全的,因为用户可以计算任何代码(包括 os-命令)。但只要您只为自己使用代码,这不是问题。
备选方案是:

  • ast.literal_eval 就像 Wombatz 对安全评估的回答
  • chr 就像 tripleee 的回答一样,这是一个非常优雅和合适的解决方案。
unicode = "U0001f0cf"
unicode = (f"\{unicode}")

print(unicode.encode('raw-unicode-escape').decode('unicode-escape'))

这给你 </code> 而不是 <code>\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