1 апреля 2010 г.

Кодировка консоли в java

Кодировка консоли в Win не совпадает с системной кодировкой (которая Charset.defaultCharset()). А знать ее часто бывает полезно. Например, запускаемые внешние процессы могут возвращать описания ошибок на русском -- и фиг вы их прочитаете. Конечно, можно просто зашить кодировку Cp866 для русской версии -- но это неправославное решение. А ну как другая локаль будет? Хотелось бы иметь возможность спросить, в какой кодировке работает наша консоль.

Я долгое время был уверен, что такого метода в jdk не предусмотрено. Но, совершенно случайно, раскапывая исходники стандартной библиотеки обнаружил решение для Sun JDK 1.6+ -- приватный статический метод java.io.Console.encoding()

final Class<Console> clazz = Console.class;
final Method method = clazz.getDeclaredMethod( "encoding", new Class[0] );
method.setAccessible( true );
final String encoding = ( String )method.invoke( null );


возвращает на моей системе Cp866, как положено.

3 комментария:

  1. Вот спасибо за решение! Не будете против, если утащу к себе, с ссылкой на оригинал?

    ОтветитьУдалить
  2. Нет, не против, конечно. Мне-то самому это решение в итоге так и не пригодилось :) Пусть хоть кому-то пользу принесет

    ОтветитьУдалить
  3. В свое время поимел я проблем с похожим багов. Тогда, кстати, пришлось выучить юникод раз и навсегда.

    И самое весёлое было то, что Java была 1.5, потому про класс Console пришлось забыть. Пришлось расчехлить JNI и дёргать имя кодировки черезе WinAPI. Опять же, более чистый способ - без взлома private метода.

    ОтветитьУдалить