Запись иврита в файл превращается в тарабарщину при запуске из экспортированной фляги - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть небольшая программа, которая записывает несколько букв иврита и цифры в файл, написанный на JAVA. Иврит написан нормально, когда я запускаю программу из Eclipse, но если я экспортирую ее в исполняемый файл JAR и запускаю оттуда, иврит превращается в бред

Мой код:

if (content.length() > 0) {
    FileWriter fileWriter = new FileWriter(path);
    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    bufferedWriter.write(content);
    bufferedWriter.close();
}

Я также пытался использовать OutputStreamWriter для установки кодировки самостоятельно:

if (content.length() > 0) {
    BufferedWriter bufferedWriter = new BufferedWriter
        (new OutputStreamWriter(new FileOutputStream(path), "windows-1255"));
    bufferedWriter.write(content);
    bufferedWriter.close();
}

Кодировки, которые я пробовал:

  • ISO-8859-8
  • Windows-1255
  • х-IBM856
  • IBM862
  • IBM424

Некоторые из них возвращают надлежащий иврит, когда я запускаю программу из затмения, но все они превращают иврит в разные типы бреда при запуске из файла JAR. Я даже не уверен, что кодировка в самом коде - это проблема или способ ее исправить.

Я запускаю JAR с использованием командного файла в Windows 10. Информация о версии Java:

  • Java-версия "10.0.1" 2018-04-17
  • Java (TM) SE Runtime Environment 18.3 (сборка 10.0.1 + 10)
  • Java HotSpot (TM) 64-битный сервер ВМ 18.3 (сборка 10.0.1 + 10, смешанный режим)

пример вывода при использовании UTF-8

Строка из файла на иврите (сгенерированная Eclipse):

210001         188      13 04/09/1804/09/18                                            50.00         1           123456789  לירון קטלן                               הרא"ה 291                                     רמת גן                                                                     6013             

Та же самая строка из файла gibberish (сгенерированного из JAR):

210001         188      13 04/09/1804/09/18                                            50.00         1           123456789  לירון קטלן                               הר�"ה 291                                     רמת גן                                                                     6013    

Не обращайте внимания на лишние пробелы, они должны быть там.

1 Ответ

0 голосов
/ 06 сентября 2018

Второй фрагмент кода с явной кодировкой правильно кроссплатформенный.

Убедитесь, что с содержимым все в порядке. Юникод:

String content="\u200F\u05D0\u05D1\u05D2\u05D3\u05D4\u200E"; // "אבגדהו"

Я использовал u-кодировку, поэтому источником java является ASCII, и, следовательно, кодировка java-компилятора и кодировка редактора должны ошибочно отличаться, не могут вызвать поврежденные строки.

Предполагая, что content является строкой:

if (!content.isEmpty()) {
    content = "\uFEFF" + content; // Add a BOM char in front for Windows
    Path p = Paths.get(path);
    Files.write(p, Collections.singletonList(content), StandardCharsets.UTF_8);
}

Записывает файл UTF-8, который вызовет наименьшее количество проблем, если только внутри Израиля, где можно предположить кодировку для конкретной страны, windows-1255.

Я добавил символ спецификации в качестве первого символа файла, чтобы Windows могла легко идентифицировать файл не как однобайтовую кодировку ANSI, а как UTF-8 Unicode.

Тогда возникает проблема представления текста на иврите. Там должен быть адекватный шрифт.

Вы можете написать HTML-файл:

<code>content = "<!DOCTYPE html><html lang="he">"
    + "<head><meta charset=\"utf-8\"></head>"
    + "<body><pre>"
    + content.replace("&", "&amp;")
             .replace("<", "&lt;")
             .replace(">", "&gt")
    + "
";

Я нахожу это лучше, чем написание спецификации.

Последнее, что нужно добавить: символы LTR ('\ u200E') ​​и RTL (справа налево, '\ u200F'), но я так понимаю, это не создает проблем.


Всегда так, что в каком-то месте используется перегруженный метод, где кодировка отсутствует, по умолчанию используется текущая кодировка платформы.

У

new InputStreamReader(..., StandardCharsets.UTF_8))

и тому подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...