Python开发Discord白名单机器人时Minecraft返回消息存在无法删除的乱码字符
问题描述
我学习Python仅数日,若问题较为基础还望见谅。当前开发目标是实现Discord机器人接收指令后,获取并返回Minecraft服务器的响应消息,本次开发场景为白名单添加功能。
实际运行时发现服务器返回消息存在异常:例如返回Player is already whitelisted提示时,内容末尾会出现带叉的方框形无法识别字符。我尝试使用[:-1][:-2]切片语法删除末尾两个字符,也尝试追加空格覆盖该异常字符,但均未生效,推测该异常内容并非普通可识别字符,在此寻求解决方案。
问题相关实现代码如下:
if message.content.startswith('whitelist add'): channel = client.get_channel(<Channel ID>) await channel.send(rcon.command(message.content)[:-1][:-2]+" ", delete_after=3) await asyncio.sleep(3) await message.delete()
问题根因
末尾带叉的方框是不可打印控制字符的渲染占位符,乱码来源分为两类:
- RCON协议帧标记:Minecraft的RCON协议实现会在每个响应包末尾追加2个
\x00(ASCII码值为0的空字节)作为包终止标识,该字符不属于可显示文本范围。 - Minecraft原生格式控制符:服务端返回的文本默认携带
§(节符号)开头的颜色、样式控制码,这类控制序列在纯文本环境下无法被解析,就会显示为乱码占位符。
固定长度切片、追加空格的方案无效的原因很明确:不同指令返回内容附带的控制符长度不是固定值,硬编码删除固定数量的字符,要么残留乱码,要么误删正常文本;追加空格是在字符串末尾新增字符,根本不会覆盖已经存在的异常字符。
修复方案
按顺序对RCON返回的原始内容做三层清理即可,不需要硬编码裁剪长度:
- 移除所有
\x00空字节 - 通过正则匹配删除所有
§开头的Minecraft格式控制符 - 对处理后的字符串做首尾空白裁剪,去除多余的换行、空格残留
修复后的核心代码如下:
import re import asyncio import discord # 提前编译正则匹配规则,减少重复性能开销 MC_FORMAT_CLEANER = re.compile(r'§[0-9a-fk-or]', re.IGNORECASE) # 其余Discord客户端初始化代码省略 @client.event async def on_message(message): if message.content.startswith('whitelist add'): channel = client.get_channel(<Channel ID>) raw_response = rcon.command(message.content) # 依次执行清理逻辑 cleaned_response = MC_FORMAT_CLEANER.sub('', raw_response) cleaned_response = cleaned_response.replace('\x00', '').strip() await channel.send(cleaned_response, delete_after=3) await asyncio.sleep(3) await message.delete()
提示:如果后续遇到其他RCON指令返回乱码,这套清理逻辑同样适用,不需要针对单个指令单独调整切片长度。
内容的提问来源于stack exchange,提问作者s3skydance
相关产品推荐
相关产品推荐

