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

Gson实现ChatColor与JSON互转时出现多余前置`Â`字符问题

问题原因

你遇到的多余Â字符是典型的字符编码不匹配导致的乱码:

  • 段落符号§的Unicode编码为U+00A7,使用UTF-8编码存储时会生成两个字节0xC2 0xA7
  • 你当前代码中使用的FileWriter、FileReader默认采用操作系统本地编码读写文件,如果本地编码不是UTF-8(比如Windows默认的GBK、Latin-1编码),读文件时会把两个字节错误识别为两个独立字符:0xC2对应Â,0xA7对应§,最终就出现了§6的错误输出。

解决方案

方案1:强制指定读写JSON时用UTF-8编码

修改ThemeManager.java中的读写文件代码,替换默认的FileWriter、FileReader,手动指定UTF-8编码:
首先导入必要的类:

import java.nio.charset.StandardCharsets;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

修改writeThemeToJSON方法:

public static void writeThemeToJSON(Theme thisTheme, File thisFile) throws IOException {
    Gson gson = new Gson();
    // 强制指定UTF-8编码写文件
    Writer writer = new OutputStreamWriter(new FileOutputStream(thisFile, false), StandardCharsets.UTF_8);
    gson.toJson(thisTheme, writer);
    writer.flush(); 
    writer.close();
}

修改getThemeFromJSON方法:

public static Theme getThemeFromJSON(File thisFile) throws FileNotFoundException {
    Gson gson = new Gson();
    // 强制指定UTF-8编码读文件
    Reader reader = new InputStreamReader(new FileInputStream(thisFile), StandardCharsets.UTF_8);
    return gson.fromJson(reader, Theme.class);
}

方案2(可选优化):自定义ChatColor的Gson序列化适配器

直接序列化整个ChatColor对象兼容性较差,你可以自定义序列化/反序列化适配器,只存储颜色的名称或字符码,既减少JSON体积也避免类结构变更导致反序列化失败:

// ChatColor适配器示例
public class ChatColorAdapter extends TypeAdapter<ChatColor> {
    @Override
    public void write(JsonWriter out, ChatColor value) throws IOException {
        out.value(value.getName());
    }

    @Override
    public ChatColor read(JsonReader in) throws IOException {
        return ChatColor.of(in.nextString());
    }
}

使用时注册到Gson实例即可:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(ChatColor.class, new ChatColorAdapter())
    .create();

内容的提问来源于stack exchange,提问作者DogeCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 18:15:04