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

构建Jar包后JSON解析字符串编码异常,捷克语特殊字符乱码

解决JSON解析后生成PDF的捷克语特殊字符乱码问题

这个问题我之前也碰到过,核心原因很明确:你用的FileReader会默认采用当前操作系统的字符编码读取文件,而非你需要的UTF-8。

在IntelliJ IDEA里运行正常,是因为IDE默认把项目的编码环境设成了UTF-8,FileReader跟着用UTF-8读取你的JSON文件;但打包成Jar后,运行环境的系统编码可能不是UTF-8(比如Windows默认是CP1250),这时候FileReader会把UTF-8编码的JSON字节按系统编码解码,就出现了你看到的PrávnĂ这种乱码——典型的UTF-8被错误解码的结果。而硬编码的标题正常,是因为编译时IDE已经把这些字符串按UTF-8处理嵌入到class文件里了,和运行环境的编码无关。

解决方案

把FileReader替换成InputStreamReader,并明确指定UTF-8编码,这样不管运行环境的系统编码是什么,都会严格按UTF-8读取JSON文件。

修改你的parseJSON方法,替换文件读取部分:

// 记得导入必要的包
import java.nio.charset.StandardCharsets;
import java.io.FileInputStream;
import java.io.InputStreamReader;

private static Category[] parseJSON(){
    JSONParser jsonParser = new JSONParser();
    Category[] categories = new Category[0];
    // 替换原来的FileReader为InputStreamReader,指定UTF-8编码
    try (InputStreamReader reader = new InputStreamReader(new FileInputStream("otazky.json"), StandardCharsets.UTF_8)){
        Object obj = jsonParser.parse(reader);
        JSONArray categoryJSONList = (JSONArray) obj;
        java.util.List<JSONObject> categoryList = new ArrayList<>(categoryJSONList);
        categories = new Category[categoryJSONList.size()];
        int i = 0;
        for (JSONObject category : categoryList) {
            categories[i] = parseCategoryObject(category);
            i++;
        }
    } catch (ParseException | IOException e) {
        e.printStackTrace();
    }
    return categories;
}

额外检查点

  • 确认你的otazky.json文件确实是无BOM的UTF-8编码保存的:如果是在Windows下创建的,不要用记事本保存(记事本默认是ANSI),用IDE或者Notepad++这类工具,选择「UTF-8(无BOM)」格式保存。
  • 确保JSON文件的路径在Jar运行时是正确的,避免出现找不到文件的问题(不过你当前的问题是乱码而非文件缺失,这条是额外提醒)。

这样修改后,打包成Jar再运行,解析出来的捷克语特殊字符应该就能正常显示在PDF里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:05:45