Сломанная кодировка UTF-8 в выводе JAR - PullRequest
0 голосов
/ 25 февраля 2019

У меня проблемы с кодировкой UTF-8 при запуске jars из cmd.При запуске проекта из IntelliJIdea у меня нет проблем, символы отображаются и выводятся правильно.

Для примера;Я использовал некоторые из предложенных решений от подобных проблем здесь, stackoverflow, который я перечислю.

public static String convertToUTF8(String s) {
        String out = null;
        try {
            out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
        } catch (java.io.UnsupportedEncodingException e) {
            return null;
        }
        return out;
    }

    System.out.println(Charset.defaultCharset());
    String test = "written in utf-8İİiiŞŞŞĞĞÜĞĞğ";
    System.out.println(test);
    System.out.println(convertToUTF8(test));
    PrintWriter out = new PrintWriter(new File("hello.txt"), "UTF-8");
    out.print("written in utf-8İİiiŞŞŞĞĞÜĞĞğ");
    out.close();

Выводы следующие:

Запуск из IntelliJIdea:

  • Выход на консоль:

    UTF-8
    written in utf-8İİiiŞŞŞĞĞÜĞĞğ
    written in utf-8Ä°Ä°iiÅÅÅÄÄÃÄÄÄ
    
  • hello.txt: записано в utf-8İİiiŞŞŞĞĞÜĞĞğ

Запуск из cmd с использованием jar

  • Вывод на консоль:

    windows-1252
    written in utf-8Ä°Ä°iiÅ?Å?Å?Ä?Ä???Ä?Ä?Ä?
    written in utf-8???°???°ii??Å???Å???Å???Å???Å???Å???Å???Å???Å?
    
  • hello.txt: записано в UTF-8 ° ° iiŞŞŞĞĞÜĞĞğ

Другоерешения, которые я проверял;

  • Добавление -Dfile.encoding=utf-8 при запуске cmd, java -Dfile.encoding=utf-8 -jar file.jar: ничего не меняется

  • Использование терминала Ubuntu:первая строка UTF-8, но остальная часть совпадает с выводом cmd.

  • Запуск chcp 65001 для изменения кодовой страницы на UTF-8: пока видимый вывод зафиксирован, привет.txt остается прежним.

  • Использование powershell: ничего не меняет.

Чего я хочу добиться, так это получить правильную обработку кодирования при запуске jar-файловиз CMD, так как я планирую намjar в качестве фонового рабочего, который будет обрабатывать множество символов в кодировке UTF-8.

Обновление: После замены символов UTF-8 на экранированные эквиваленты Unicode;как от ç до \u011f, код выполняется так, как ожидалось.Меня беспокоит то, что, хотя я могу выполнять функцию замены строк, например, replace ("ç", '\ u011f'), и jar работает гладко, почему система не справляется с этим правильно при выводе?Если система понимает тип char во время выполнения, почему я получаю символы Ä на выходе?

1 Ответ

0 голосов
/ 28 февраля 2019

Есть несколько незначительных проблем, которые должны быть легко решены (по крайней мере, в Windows):

  1. При создании String в методе convertToUTF8() неиспользуйте кодировку ISO-8859-1 .Он не поддерживает турецкие символы, что объясняет, почему convertToUTF8() не возвращает ожидаемое значение String.Для исправления просто используйте UTF-8 вместо:

    out = new String(s.getBytes("UTF-8"), StandardCharsets.UTF_8.displayName());

  2. При запуске из командной строки вам необходимо использовать -Dfile.encoding = UTF-8 для file.encoding .Я заметил, что вы установили -Dfile.encoding = utf-8 , поэтому вы можете попробовать изменить utf-8 на верхний регистр.Поскольку windows-1252 отображается как defaultCharset(), похоже, что ваше значение utf-8 игнорируется.

Этот код работает для меня, где единственное существенное отличие от вашего - это присвоение out в методе convertToUTF8():

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class Main {

    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {

        System.out.println(Charset.defaultCharset());
        String test = "written in utf-8İİiiŞŞŞĞĞÜĞĞğ";
        System.out.println(test);
        System.out.println(convertToUTF8(test));
        PrintWriter out = new PrintWriter(new File("hello.txt"), StandardCharsets.UTF_8.displayName());
        out.print("written in utf-8İİiiŞŞŞĞĞÜĞĞğ");
        out.close();
    }

    public static String convertToUTF8(String s) {
        String out = null;
        try {
            out = new String(s.getBytes("UTF-8"), StandardCharsets.UTF_8.displayName());
        } catch (java.io.UnsupportedEncodingException e) {
            return null;
        }
        return out;
    }
}

Этовывод при работе в Intellij IDEA:

C:\Java\openJDK\jdk-11.0.2\bin\java.exe -javaagent:C:\Users\johndoe\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\191.5109.14\lib\idea_rt.jar=60362:C:\Users\johndoe\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\191.5109.14\bin -Dfile.encoding=UTF-8 -classpath C:\Users\johndoe\IdeaProjects\TurkishChars\out\production\TurkishChars Main
UTF-8
written in utf-8İİiiŞŞŞĞĞÜĞĞğ
written in utf-8İİiiŞŞŞĞĞÜĞĞğ

Process finished with exit code 0

И это вывод консоли при запуске из командной строки:

Microsoft Windows [Version 10.0.17763.316]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\johndoe>chcp 65001
Active code page: 65001

C:\Users\johndoe>C:\Java\openJDK\jdk-11.0.2\bin\java.exe -javaagent:C:\Users\johndoe\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\191.5109.14\lib\idea_rt.jar=60362:C:\Users\johndoe\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\191.5109.14\bin -Dfile.encoding=UTF-8 -classpath C:\Users\johndoe\IdeaProjects\TurkishChars\out\production\TurkishChars Main
UTF-8
written in utf-8İİiiŞŞŞĞĞÜĞĞğ
written in utf-8İİiiŞŞŞĞĞÜĞĞğ

C:\Users\johndoe>cd C:\Users\johndoe\IdeaProjects\TurkishChars

C:\Users\johndoe\IdeaProjects\TurkishChars>type hello.txt
written in utf-8İİiiŞŞŞĞĞÜĞĞğ
C:\Users\johndoe\IdeaProjects\TurkishChars>

TurkishChars


Обновление:

Предложение от @Noodles проверить ваш шрифт хорошее.Попробуйте вставить тестовый текст непосредственно в окно Командная строка , чтобы убедиться, что он отображается правильно (используя echo, записанный в utf-8İİiiŞŞŞĞĞÜĞĞğ ).Если нет, измените шрифт. Курьер Новый у меня работает:

echoText

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