【问题标题】:Unicode for an emoji in a string variable isn't shown as the emoji字符串变量中表情符号的 Unicode 未显示为表情符号
【发布时间】:2021-11-07 00:18:14
【问题描述】:

首先,对不起,我的英语很差,很接近……

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

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

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

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

这是导致我问题的部分,其余的过程都可以... 为了翻译 emoji 的名字,从 unicode,我找到了这个方法(从另一个 Stackoverflow 主题制作)

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

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

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

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

【问题讨论】:

标签: python unicode emoji python-unicode python-3.9


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    首先从变量中获取数字部分,然后使用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
    

    【讨论】:

      【解决方案3】:
      unicode = "U0001f0cf"
      unicode = (f"\{unicode}")
      
      print(unicode.encode('raw-unicode-escape').decode('unicode-escape'))
      

      这会给你? 而不是\U0001f0cf

      【讨论】:

        【解决方案4】:

        您可以为此使用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 中将其用作字符串文字。

        【讨论】:

        • 谢谢!您提出的解决方案(使用literal_eval())与仅使用eval() 的Kesslwovv 解决方案之间有区别吗?
        • litteral_eval 更安全。 python 的内置文档(python shell 中的help())指出:literal_eval(node_or_string): Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None.
        【解决方案5】:

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

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

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

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

        在这种情况下,f'"\\{unicode}"' 被评估为 '"\U0001f0cf"',并且 f 字符串中的字符串被评估("\U0001f0cf" 到 ?`)。

        编辑(因为三人组的评论):

        eval 与用户输入一起使用时是不安全的,因为用户可以评估任何代码(包括 os-commands)。但只要您只为自己使用代码,这不是问题。
        替代方案是:

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

        【讨论】:

        • 非常感谢! 我对基本功能缺乏了解,但又很重要,这让我再次失望了。它工作得很好,我会用你的简单和解释的答案报告这个话题已经解决了:))
        • 请不要推荐eval。有很多更简单、更不安全的方法来做到这一点。
        • 为什么它“不安全”? @tripleee
        猜你喜欢
        • 2020-06-23
        • 1970-01-01
        • 2019-05-20
        • 2016-02-07
        • 2016-03-22
        • 2015-05-09
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多