You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:42:15