Pyrogram使用emoji.demojize处理Telegram消息报UTF-16-le解码错误求助
问题描述
使用Pyrogram开发Telegram自动化脚本时,集成emoji库对指定机器人发来的文本做demojize转换,调用emoji.demojize()处理消息文本时持续抛出以下错误:
UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 2-3: unexpected end of data
此前基于telebot开发机器人时使用emoji库从未出现同类问题,初步判断问题与Pyrogram的消息解析机制有关。
参考代码如下:
from pyrogram import Client, filters, idle import emoji app1 = Cliente('MyAccount', api_id, api_hash) @app1.on_message(filters.chat("@somebot") & filters.incoming) def listener(client, message): print(emoji.demojize(message.text)) app1.start() idle()
问题根因
该错误由Pyrogram的文本解析逻辑和emoji库的输入校验规则共同导致:
- Telegram的MTProto协议底层使用UTF-16编码计数文本偏移,传输码点超过U+FFFF的字符(绝大多数emoji属于这类字符)时会拆分为两个UTF-16代理对传输
- Pyrogram 1.x版本未对传输得到的代理对做完整拼接,返回的
message.text中可能残留孤立代理对(即单独存在的半段代理标记,不属于合法Unicode标量值) emoji.demojize()内部会对输入字符串做编码合法性校验,遇到孤立代理对就会抛出Unicode解码错误- telebot库默认在返回消息文本前完成了代理对拼接和非法字符清理,因此不会触发同类报错
解决方案
方案1:转码清理非法代理对(兼容所有Pyrogram版本,推荐)
在传入emoji库前,对文本做一次转码处理,自动跳过/修复孤立代理对,得到合法Unicode字符串:
from pyrogram import Client, filters, idle import emoji # 修复原代码拼写错误:Cliente -> Client app1 = Client('MyAccount', api_id, api_hash) @app1.on_message(filters.chat("@somebot") & filters.incoming) def listener(client, message): if not message.text: return # 清理孤立代理对 processed_text = message.text.encode( 'utf-16-le', errors='surrogatepass' ).decode('utf-16-le', errors='ignore') print(emoji.demojize(processed_text)) app1.start() idle()
方案2:升级Pyrogram版本
Pyrogram 2.0及以上稳定版本已经修复了文本解析时残留孤立代理对的问题,直接升级依赖即可解决绝大多数场景下的报错:
pip install --upgrade pyrogram
注意:原参考代码存在拼写错误,Pyrogram的客户端类名为
Client,误写为Cliente会直接导致脚本启动失败。
内容的提问来源于stack exchange,提问作者Miguel Espinosa
相关产品推荐
相关产品推荐

