【问题标题】:how to handle list that contains emoji in Python3如何在 Python3 中处理包含表情符号的列表
【发布时间】:2021-01-12 09:05:23
【问题描述】:

我一直在制作函数,它接受只有表情符号的列表并将其传输到 utf-8 unicode 并返回 unocode list 。我当前的代码似乎需要多个参数并返回 error 。我是处理表情符号的新手。你能给我一些建议吗??

main.py

def encode_emoji(emoji_list):
    result = []
    for i in range(len(emoji_list)):
        emoji = str(emoji_list[i])
        d_ord = format(ord(":{}:","#08x").format(emoji))
        result.append(str(d_ord))
        break
    return result 


encode_emoji(["????","????","????"])
Result of above code

Traceback (most recent call last):
  File "main.py", line 11, in <module>
    encode_emoji(["????","????","????"])
  File "main.py", line 5, in encode_emoji
    d_ord = format(ord(":{}:","#08x").format(emoji))
TypeError: ord() takes exactly one argument (2 given)

【问题讨论】:

    标签: python-3.x unicode emoji


    【解决方案1】:

    我不知道您打算如何使用此行获取表情符号的 utf-8 编码:

    d_ord = format(ord(":{}:","#08x").format(emoji))
    

    正如错误消息所说,ord 将采用单个参数:一个 1 字符的长字符串,并返回一个整数。现在,即使放置上面的代码,以便 ord(emoji) 返回的值正确连接到 0x8 作为前缀,这基本上也是一个基本随机十六进制数的特定表示 - 而不是 utf-8 序列对于表情符号。

    要将某些文本编码为 utf-8,只需调用字符串本身的 encode 方法即可。

    此外,在 Python 中,几乎永远不会使用 for... in range(len(...)) 模式,因为 for 被精心设计用于迭代任何序列或可迭代而没有副作用。

    您的代码还有一个松散放置的 break 语句,它将在第一个字符之后停止任何处理。

    不使用列表理解语法,将表情符号编码为 utf-8 字节字符串的函数只是:

    def encode_emoji(emoji_list):
       result = []
       for part in emoji_list:
           result.append(part.encode("utf-8"))
    

    一旦您更熟悉该语言并理解理解,那就是:

    
    def encode_emoji(emoji_list):
        return [part.encode("utf-8") for part in emoji_list)]
    

    现在,鉴于您的代码中的#8 模式,您可能误解了 utf-8 的含义,只是试图将表情符号写为有效的 HTML 编码字符引用 - 稍后将嵌入将被编码为 utf-8 的文本。

    在这种情况下,您确实必须调用ord(emoji) 来获取它的代码点,然后将结果数字表示为十六进制,并将前导的0x Python 的hex 调用收益替换为#

    
    def encode_emoji(emoji_list):
        return [hex(ord(emoji)).replace("0x", "#") + ";" for emoji in emoji_list)]
    

    【讨论】:

    • 非常感谢您的宝贵建议。我应该更多地了解基本的 Python 思想和 unicode 。我使用此代码 d_ord = format(ord(":{}:","#08x").format(emoji)) 粗心因为我通常使用 print(format(ord(":?:"),"#08x")) 检查 unicode。我试过你的代码,它没有任何错误。
    • 我想要这样的列表 0x01F607,? 所以首先我尝试获取 unicode 列表,稍后我将制作它们的字典。我不确定我的想法是否会奏效,但我会根据您的建议进行尝试。我很感激。
    【解决方案2】:

    TypeError: ord() 只接受一个参数(给定 2 个)

    我认为错误是不言自明的。该函数接受一个参数,但您传递了两个参数:

    1. ":{}"
    2. “#08x”

    Here 一些文档供您阅读以备不时之需。

    【讨论】:

    • 非常感谢。我会再检查一遍。
    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 2016-10-05
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多