Кодировка символов анализируемых строк неверна только после сборки jar - PullRequest
0 голосов
/ 19 апреля 2019

Я пишу программу, которая генерирует 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Ă норма:
a) je obecnÄ ›závaznĂ © pravidlo chovánĂ, kterĂ © nemusĂ mĂt urÄŤitou formu,
б) Немного об этом.
...

Хотя мне нужно, чтобы это выглядело так:

...
Правильные нормы:
а) я знаю, что оно было написано,
б) Немного божьей души, пржедпису,
...

1 Ответ

1 голос
/ 19 апреля 2019

Бенджамин Уркхарт предложил мне попробовать FileReader и FileInputStream вместо *1003* для чтения файла, потому что с FileReader вы не можете указать кодировку (используется системное значение по умолчанию).Я нахожу эти два метода сложными в использовании, но я нашел альтернативу - Files.readAllLines, которая довольно проста в использовании, и она сработала.

...