我正在编写一个程序,生成可打印考试的PDF文件。我将所有考题存储在JSON文件中。问题是考试是捷克语,所以有许多特殊字符(特别是ěščřžýáíé)。当我在Idea中运行程序时,它完美地运行 - 输出完全符合预期。
但是当我构建jar可执行文件时,生成的文件会包含错误的编码文本块。特别是通过JSON解析器的任何东西。像标题等硬编码的所有内容都被正确编码,因此错误必须在解析器中。
JSON输入文件以UTF-8编码。
我使用这两种方法来解析JSON文件。
private static Category[] parseJSON(){
JSONParser jsonParser = new JSONParser();
Category[] categories = new Category[0];
try (FileReader reader = new FileReader("otazky.json")){
// Read JSON file
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;
}
private static Category parseCategoryObject(JSONObject category) {
String categoryName = (String) category.get("name");
int generateCount = (int) (long) category.get("generateCount");
JSONArray questionsJSONArray = (JSONArray) category.get("questions");
java.util.List<JSONObject> questionJSONList = new ArrayList<>(questionsJSONArray);
Question[] questions = new Question[questionJSONList.size()];
int j = 0;
for (JSONObject question : questionJSONList) {
JSONArray answers = (JSONArray) question.get("answers");
String s = (String) question.get("question");
String[] a = new String[answers.size()];
for (int i = 0; i < answers.size(); i++) {
a[i] = answers.get(i).toString();
}
int c = (int) (long) question.get("correct");
Question q = new Question(s, a, c);
questions[j] = q;
j++;
}
return new Category(categoryName, questions, generateCount);
}
输出如下所示:
... PrĂvnĂnorma: a)jeobecnÄ>zĂvaznĂ©pravidlochovĂnĂ,kterĂ©nemusĂmöŤngurÄŤitouformu, b)nemĹŻĹľe找到书籍edpisu的文本, ...
虽然我需要它看起来像这样:
... 法律标准: (a)是一项具有普遍约束力的行为准则,可能不采取某种形式; (b)它不能构成法律的一部分; ...
Benjamin Urquhart建议我尝试使用InputStringReader
和FileInputStream
而不是FileReader
来读取文件,因为使用FileReader
你无法指定编码(使用系统默认值)。我发现这两种方法难以使用,但我找到了另一种选择 - Files.readAllLines
,它相当容易使用,并且它有效。