如何将字符串存储在变量中,然后在Python的其他函数或方法中使用这些变量?

xkftehaa  于 2024-01-05  发布在  Python
关注(0)|答案(3)|浏览(88)

所以我遇到了这个简单的问题,在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工作。

bvk5enib

bvk5enib1#

你从根本上误解了 string literal(创建string对象的源代码)和 string(实际对象)之间的区别。
如果我写

"\n"

字符串
在源代码中,这是 * 一个字符串字面量 *,它的计算结果是一个字符串,其中只有一个字符,即换行符

>>> print("\n")

>>> len("\n")
1
>>> list("\n")
['\n']


如果我写r"\{}".format('n'),这将创建一个字符串,它 * 看起来 * 像一个换行符的字符串字面量,但它 * 不是源代码 *。它是一个字符串 *,有两个字符 *,反斜杠字符和'n'字符:

>>> string = r"\{}".format('n')
>>> print(string)
\n
>>> len(string)
2
>>> list(string)
['\\', 'n']


如果你想接受unicode代码点,也就是 * 简单的数字 *,在你的例子中,你似乎提供了16进制。你链接到的所有代码都是将表示16进制数字的字符串转换为int对象(第二个参数是基数,它默认为基数10),然后它使用chr函数从该数字中检索unicode字符:

>>> number_string = "0001f0cf"
>>> int(number_string, 16)
127183
>>> chr(127183)
'🃏'


最后,如果你想使用CLDR名称,你可以使用unicodedata模块(标准库的一部分):

>>> import unicodedata
>>> cldr_name = "slightly smiling face"
>>> print(unicodedata.lookup(cldr_name))
🙂

lndjwyie

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 包转换为字符。

import regex
import emoji

emoji_cp = False
emoji_input = input("Enter the emoji:- ")

chars = []
emoji_out = ''
hex_pattern = regex.compile(r'^(?:(\p{Hex_Digit}{4,5})\p{White_Space}*)+$')
if hex_pattern.match(emoji_input):
    emojis = emoji_input.split()
    for emoji in emojis:
        chars.append(chr(int(emoji, 16)))
    emoji_out = "".join(chars)
else:
    emoji_input = regex.sub(r'[:,\p{White_Space}]+', '_', emoji_input)
    emoji_out = emoji.emojize(f":{emoji_input}:")
print(emoji_out)

字符串
代码的输入和输出示例:
| 输入|输出|
| --|--|
| 女人打手势OK|🙆‍♀️|
| 家庭:男人,女人,女孩,男孩|👨‍👩‍👧‍👦|
| 家庭男人女人女孩男孩|👨‍👩‍👧‍👦|
| 1F468 200D 1F469 200D 1F467 200D 1F467|👨‍👩‍👧‍👧|
| 小行星2764| ❤️|
| 左手食指|👈|
| 1F64F|🙏|

pjngdqdw

pjngdqdw3#

方法一

为了修复方法一,我们使用int将输入转换为整数,然后使用chr将该整数转换为相应的Unicode字符。这样,您就可以获得实际的emoji。

user_emoji = input("Enter the unicode:- ")
print(chr(int(user_emoji, 16)))

字符串
如果我们输入1F642,也就是unicode for "slightly smiling face",我们会得到正确的输出


的数据

方法二

另一方面,我不推荐使用方法2。它不是很直接,也没有好的解决方案,使用方法1应该没问题。如果你真的想使用CLDR名称,你可能需要创建一个Map或使用一个提供这种Map的库。
一个简单的Map字典可能看起来像这样:

cldr_mapping = {
    "slightly smiling face": "\U0001F642",
}

user_emoji = input("Enter the CLDR name:- ")
print(cldr_mapping.get(user_emoji, "Emoji not found bro"))

相关问题