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

