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
相关产品推荐
相关产品推荐

