Java 只有在构建jar之后,解析字符串的字符编码才是错误的

Java 只有在构建jar之后,解析字符串的字符编码才是错误的,java,character-encoding,itext,json-simple,Java,Character Encoding,Itext,Json Simple,我正在编写一个程序,生成可打印考试的PDF文件。我将所有的考试问题存储在一个JSON文件中。问题是考试是捷克语的,因此有很多特殊字符(特别是ěšřýýáé)。当我在Idea中运行这个程序时,它工作得非常完美——输出与预期完全一致 但是,当我构建jar可执行文件时,生成的文件包含错误编码的文本块。特别是通过JSON解析器的任何内容。所有硬编码的东西,如标题等,都被正确编码,所以错误一定是在解析器中 JSON输入文件以UTF-8编码 我使用这两种方法来解析JSON文件 private static

我正在编写一个程序,生成可打印考试的PDF文件。我将所有的考试问题存储在一个JSON文件中。问题是考试是捷克语的,因此有很多特殊字符(特别是ěšřýýáé)。当我在Idea中运行这个程序时,它工作得非常完美——输出与预期完全一致

但是,当我构建jar可执行文件时,生成的文件包含错误编码的文本块。特别是通过JSON解析器的任何内容。所有硬编码的东西,如标题等,都被正确编码,所以错误一定是在解析器中

JSON输入文件以UTF-8编码

我使用这两种方法来解析JSON文件

private static Category[]parseJSON(){
JSONParser JSONParser=新的JSONParser();
类别[]类别=新类别[0];
try(FileReader=newfilereader(“otazky.json”)){
//读取JSON文件
objectobj=jsonParser.parse(reader);
JSONArray类别JSONLIST=(JSONArray)obj;
java.util.List categoryList=新的ArrayList(categoryJSONList);
categories=新类别[CategoriyJSONList.size()];
int i=0;
for(JSONObject类别:categoryList){
类别[i]=parseCategoryObject(类别);
i++;
}
}catch(ParseException | IOException e){
e、 printStackTrace();
}
退货类别;
}
私有静态类别parseCategoryObject(JSONObject类别){
String categoryName=(String)category.get(“名称”);
int generateCount=(int)(long)category.get(“generateCount”);
JSONArray questionsJSONArray=(JSONArray)category.get(“questions”);
java.util.List questionJSONList=新的ArrayList(questionsJSONArray);
问题[]问题=新问题[questionJSONList.size()];
int j=0;
for(JSONObject问题:问题JSONList){
JSONArray answers=(JSONArray)问题。获取(“答案”);
字符串s=(字符串)question.get(“question”);
String[]a=新字符串[answers.size()];
for(int i=0;i
输出如下所示:


PrĂvnĂnorma:
a) 我是obecnÄ›zĂvaznĂ©pravidlo chovĂnĂ,kterĂ©nemusĂmĂt urÄ356; itou formu,
b) 我的名字是:nemĹe bĂt souÄŤĂstĂprĂvnĂho pĹ™edpisu,
...

虽然我需要它看起来像这样:


普拉夫尼诺玛:
a) 我是obecnězávaznépravidlo chování,kterénemusímít určitou formu,
b) 涅姆ůže být součstíprávního předpisu,

…Benjamin Urquhart建议我尝试使用
InputStringReader
FileInputStream
而不是
FileReader
来读取文件,因为使用
FileReader
无法指定编码(使用系统默认值)。我发现这两种方法很难使用,但我找到了另一种方法--
Files.readAllLines
,它非常容易使用,而且很有效。

您是否尝试使用UTF-8编码显式打开文件?查看,FileReader将使用默认字符编码打开文件-在windows上不是UTF-8。我建议使用
InputStringReader
FileInputStream
而不是
FileReader
@BenjaminUrquhart非常感谢!我发现使用
InputStringReader
+
FileInputStream
combo很混乱,但我最终尝试了
Files.readAllLines()
,您可以在其中指定编码并使用它!我现在如何结束这个问题提出你自己的答案并在2天后接受。用户系统的当前默认值永远不是你想要使用的,除非它正是你需要使用的。IETF标准规定JSON应该采用UTF-8格式。几乎没有理由不这样做。