Java: Как обнаружить (и изменить?) Кодировку System.console? - PullRequest
17 голосов
/ 10 марта 2010

У меня есть программа, которая работает на консоли, а ее умлауты и другие специальные символы выводятся как? На Mac. Вот простая тестовая программа:

public static void main( String[] args ) {
    System.out.println("höhößüä");
    System.console().printf( "höhößüä" );
}

На консоли Mac по умолчанию (с кодировкой UTF-8 по умолчанию) выводится:

 h?h????
 h?h????

Но после ручной настройки кодировки терминала Mac на «Mac OS Roman» он правильно напечатал

 höhößüä
 höhößüä

Обратите внимание, что в системах Windows, использующих System.console (), работает:

 h÷h÷▀³õ
 höhößüä

Так как мне сделать мою программу ... rolleyes ... "работать везде"?

Ответы [ 2 ]

13 голосов
/ 10 марта 2010

Попробуйте следующий аргумент командной строки при запуске приложения:

-Dfile.encoding=utf-8

Это изменяет кодировку по умолчанию JVM для операций ввода-вывода.

Вы также можете попробовать:

System.setOut(new PrintStream(System.out, true, "utf-8"));
10 голосов
/ 10 марта 2010

Эпага: посмотрите прямо здесь . Вы можете установить выходную кодировку в принт-потоке - просто нужно определить или быть абсолютно уверенным в том, что именно устанавливается.

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

public class Test {
    public static void main (String[] argv) throws UnsupportedEncodingException {
    String unicodeMessage =
    "\u7686\u3055\u3093\u3001\u3053\u3093\u306b\u3061\u306f";

    PrintStream out = new PrintStream(System.out, true, "UTF-8");
    out.println(unicodeMessage);
  }
}

Чтобы определить кодировку консоли, вы можете использовать системную команду "locale" и проанализировать вывод, который в немецкой системе UTF-8 выглядит следующим образом:

LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL=
...