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

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返回的原始内容做三层清理即可,不需要硬编码裁剪长度:

  1. 移除所有\x00空字节
  2. 通过正则匹配删除所有§开头的Minecraft格式控制符
  3. 对处理后的字符串做首尾空白裁剪,去除多余的换行、空格残留

修复后的核心代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:45:48