繁体   English   中英

仅在构建jar之后,解析字符串的字符编码才错误

[英]Character encoding of parsed strings is wrong only after building jar

我正在编写一个生成可打印考试的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)jeobecnÄ› závaznĂ©pravidlo chovánĂ,kterĂ©nemusĂmĂturÄŤitouformu,
b)nemĹŻĹľebĂ˝tsoučástĂ právnĂhopĹ™edpisu,
...

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

...
Právnínorma:
a)jeobecnězávaznépravidlochování,kterénemusímíturčitouformu,
b)nemůžebýtsoučástíprávníhopředpisu,
...

Benjamin Urquhart建议我尝试使用InputStringReaderFileInputStream代替FileReader来读取文件,因为使用FileReader不能指定编码(使用系统默认值)。 我发现这两种方法很难使用,但找到了另一种方法Files.readAllLines ,它相当容易使用,并且可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM