字符串变量中表情符号的 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
首先,抱歉我的英语水平很差...
我正在尝试编写一个 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