Tkinter 无法从条目中解码表情符号

Posted

技术标签:

【中文标题】Tkinter 无法从条目中解码表情符号【英文标题】:Tkinter cant decode emojis from entryy 【发布时间】:2020-05-11 03:49:18 【问题描述】:

我有一个我的程序示例:

import re
import tkinter as T
_nonbmp = re.compile(r'[\U00010000-\U0010FFFF]')

def _surrogatepair(match):
    char = match.group()
    assert ord(char) > 0xffff
    encoded = char.encode('utf-16-le')
    return (
        chr(int.from_bytes(encoded[:2], 'little')) + 
        chr(int.from_bytes(encoded[2:], 'little')))

def createSurrogate(data):
    return _nonbmp.sub(_surrogatepair, data)

def server_send(event=None):
    data = entry_field.get()
    server.send(data, False)
    entry_text.set("")

def insertEmoji(code):
    entry_field.insert("insert", code)

def emoji():
    win = T.Tk()
    win.title("Emojis")
    emoji1 = T.Button(win, text=createSurrogate("\U0001F602"), command=lambda: insertEmoji("\U0001F602"))
    emoji1.pack()
    win.mainloop()

main = T.Tk()
main.title("SDT_Client")
entry_text = T.StringVar()
entry_text.set("")
messages_frame = T.Frame(main)
scrollbar = T.Scrollbar(messages_frame)  
msg_list = T.Listbox(messages_frame, height=15, width=100, yscrollcommand=scrollbar.set)
scrollbar.pack(side=T.RIGHT, fill=T.Y)
msg_list.pack(side=T.LEFT, fill=T.BOTH)
msg_list.pack()
messages_frame.pack()

entry_field = T.Entry(main, textvariable=entry_text)
entry_field.bind("<Return>", server_send)
entry_field.pack()
send_button = T.Button(main, text="Send", command=server_send)
send_button.pack()
emojiButton = T.Button(main, text="Emojis", command=emoji)
emojiButton.pack()

总而言之,我有一个条目,下方有一个发送按钮,下方有一个表情符号按钮。单击发送按钮时,条目的内容将发送到服务器。单击表情符号按钮时,将打开一个新窗口,其中显示更多带有表情符号的按钮。单击其中一个按钮时,表情符号将插入到输入字段中。但是当我尝试发送包含表情符号的消息时,我收到以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\....\nClient.py", line 36, in server_send
    data = entry_field.get()
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\tkinter\__init__.py", line 2682, in get
    return self.tk.call(self._w, 'get')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte

我知道问题出在以下行:

data = entry_field.get()

但我想不出解决办法。

【问题讨论】:

【参考方案1】:

错误是因为 python 使用 utf-8 而 emojis 使用不同的编解码器,这是我为你找到的:https://pypi.org/project/emoji-encoding/。如果您想自己更改编码,这是我找到的一个 SO question Changing default encoding of Python?。

编辑 1:

在记事本中打开代码,然后单击“文件”,然后单击“另存为”,然后单击“编码:ANSI”,然后单击 UTF-8,然后单击“是”确认。

您可以删除部分代码来解码表情符号,因为 python 已经为您做到了:)

(抱歉,第一个答案很愚蠢)

【讨论】:

以上是关于Tkinter 无法从条目中解码表情符号的主要内容,如果未能解决你的问题,请参考以下文章

从 Unicode 字符串中正确提取表情符号

无法从反应中读取标准表情符号名称 [discord.js]

ctf中涉及emoji表情的密码学问题怎么解

Discord bot 动画表情符号无法获取并用作反应

如何将表情符号嵌入到 Tweepy 状态文本中?

从 iPhone 到 Python/Django 的表情符号