Проблемы с кодировкой (немецкий Umlaut) в Excel / Java / Json - PullRequest
1 голос
/ 05 апреля 2019

У меня есть небольшая программа на Java, которая читает содержимое из файла .xlsx и записывает часть его в новый файл .json.В ячейках .xlsx есть несколько строк с немецкими умлаутами ("ä, ö, ü").

Моя проблема:
Если программа работает на MacOS, все работает нормально.
ЕслиПрограмма работает в Windows, умлауты отображаются в виде вопросительных знаков � в сгенерированном файле .json.

Что я пробовал:
1. установить кодировку текстового файла Project в IDE, в которой я работаю (Eclipse), на UTF-8
2. установить кодировку файла Excel(в Windows) до UTF-8

Вот базовая структура моего кода с использованием библиотек json simple, gson и apache-poi.

Чтение .xlsxfile:

FileInputStream in = new FileInputStream(file);
Workbook workbook = new XSSFWorkbook(in);

Функция, которую я использую повсеместно для чтения содержимого ячеек Row.getCell(index).getStringCellValue().

Я помещаю прочитанное содержимое в поле String объекта типа Spielи сгенерируйте соответствующий файл .json из этого объекта следующим образом:

FileWriter writer = new FileWriter("Levels.json");

Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
gson.toJson(spiel, writer);

writer.close();

Как я уже сказал, все работает нормально, когда я работаю на Mac.В файле Excel есть Umlauts, и когда я открываю сгенерированный файл .json в TextEdit (как файл в кодировке UTF-8), они отображаются нормально.

Если я запускаю в Windows и открываю сгенерированный файл .jsonнапример, на Wordpad все символы Umlauts заменяются этим знаком �.

Поскольку в будущем мне нужно запустить программу на Windows, мне действительно нужно решить эту проблему.Что я могу делать не так?

1 Ответ

4 голосов
/ 05 апреля 2019

Проблема в том, что FileWriter не позволяет вам указывать кодировку и использует кодировку платформы по умолчанию, которая может отличаться для каждого. (И это "UTF-8" для MacOS, в то время как это зависит от настроек Windows в Windows)

Вместо этого используйте:

Writer writer = new OutputStreamWriter(new FileOutputStream("Levels.json"), 
                                       StandardCharsets.UTF_8);

(JSON всегда использует кодировку UTF-8 в соответствии со стандартом JSON)

...