所以我遇到了这个简单的问题,在python中打印表情符号。我假设有多种方法可以做到这一点,但这些是我发现的三个主要方法:
1.使用emoji的UNICODE
1.使用emoji的CLDR名称
1.使用emoji模块
我想做一个程序(使用三种方法中的每一种),我们从用户那里得到一个输入,询问他们想要打印哪个表情符号,然后在下一行打印出来。
这意味着-如果程序是使用方法1创建的,用户必须输入一个unicode。如果它是使用方法2创建的,他们必须输入CLDR名称。如果它是使用方法3创建的,他们必须输入emoji的名称(基于emoji模块的语法)。
我面临的实际问题是将用户输入的内容存储到一个变量中,然后尝试使用该变量生成一个表情符号。这是因为输入内容存储为字符串,因此在打印时,print命令只是打印字符串,而不是将其视为Unicode。
**方法1:**我试过了
user_emoji = input("Enter the unicode:- ")
print(r"\{}".format(user_emoji))
字符串
但这只是给了我以下当我试图进入unicode
\U0001f0cf
型
当我在网上查找here时,我找到了一个解决方案,但并没有真正理解这里到底发生了什么。
**方法2:**我试过了
user_emoji = input("Enter the CLDR name:- ")
print(r"\N{}".format(user_emoji))
型
但是当我输入“微微微笑的脸”时,我又一次得到了正常的文本。
\Nslightly smiling face
型
在这里,我想,如果有一种方法可以将CLDR名称转换为UNICODE,那么我可以使用上面的解决方案并以蛮力的方式获得结果,但我也找不到这样做的方法。
对于方法3我尝试
import emoji
user_emoji = input("Enter the emoji name:- ")
user_emoji = user_emoji.replace(" ","_")
print(emoji.emojize(r':{}:'.format(user_emoji)))
型
这是唯一的方法,给我想要的结果时,我给'微微微笑的脸'作为输入。
🙂
型
希望有人能解释一下方法1中的解决方案是如何工作的,以及我需要做些什么才能让方法2工作。
3条答案
按热度按时间bvk5enib1#
你从根本上误解了 string literal(创建string对象的源代码)和 string(实际对象)之间的区别。
如果我写
字符串
在源代码中,这是 * 一个字符串字面量 *,它的计算结果是一个字符串,其中只有一个字符,即换行符。
型
如果我写
r"\{}".format('n')
,这将创建一个字符串,它 * 看起来 * 像一个换行符的字符串字面量,但它 * 不是源代码 *。它是一个字符串 *,有两个字符 *,反斜杠字符和'n'字符:型
如果你想接受unicode代码点,也就是 * 简单的数字 *,在你的例子中,你似乎提供了16进制。你链接到的所有代码都是将表示16进制数字的字符串转换为
int
对象(第二个参数是基数,它默认为基数10),然后它使用chr
函数从该数字中检索unicode字符:型
最后,如果你想使用CLDR名称,你可以使用
unicodedata
模块(标准库的一部分):型
lndjwyie2#
Emoji可以分为两大类:简单emoji(由单个Unicode代码点组成)和复杂emoji(由单个emoji的多个代码点组成)
为了说明复杂性,我从Full Emoji List, v15.1中使用代码点和emoji的 *CLDR短名称 * 绘制了一些emoji。见下表。
OP希望能够在给定1)代码点,2)emoji名称,3)使用 emoji 包的情况下打印emoji。
目前通过名称获取emoji字符的唯一方法是使用 emoji 包,由于 emoji 包支持别名和一系列参数,因此最实用的方法是将合并2)和3)合二为一,只支持codepoint和The CLDR短名称。
Python支持
\N{}
语法来指定字符串中的字符。也可以使用 unicodedata 模块。但这些方法只能支持简单的emoji,而不能用于复杂的emoji。我倾向于使用 regex 模块而不是 re,但regex模式可以重写为 re。
代码:
1.读入终端输入
1.测试输入是否由四到五个字符(代码点)的十六进制数字序列组成
1.如果是codepoints,则拆分输入并将每个codepoints转换为字符,然后加入字符。否则,它将清理输入字符串并使用 emoji 包转换为字符。
字符串
代码的输入和输出示例:
| 输入|输出|
| --|--|
| 女人打手势OK|🙆♀️|
| 家庭:男人,女人,女孩,男孩|👨👩👧👦|
| 家庭男人女人女孩男孩|👨👩👧👦|
| 1F468 200D 1F469 200D 1F467 200D 1F467|👨👩👧👧|
| 小行星2764| ❤️|
| 左手食指|👈|
| 1F64F|🙏|
pjngdqdw3#
方法一
为了修复方法一,我们使用
int
将输入转换为整数,然后使用chr
将该整数转换为相应的Unicode字符。这样,您就可以获得实际的emoji。字符串
如果我们输入
1F642
,也就是unicode for "slightly smiling face",我们会得到正确的输出的数据
方法二
另一方面,我不推荐使用方法2。它不是很直接,也没有好的解决方案,使用方法1应该没问题。如果你真的想使用CLDR名称,你可能需要创建一个Map或使用一个提供这种Map的库。
一个简单的Map字典可能看起来像这样:
型