Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема с кодировкой в Ant


Автор: AntonSaburov 11.11.2005, 12:27
Это, собственно, не вопрос, а описание решения, на поиск которого у меня ушел целый день. Так что если кто-нибудь когда-нибудь столкнется с аналогичной проблемой, он сможет найти этот пост через поиск.

Дорогой Человек-Из-Будущего!

Я очень рад, что твой поиск привел тебя на эту страницу. Мне горько сознавать, что мир будушего не очень-то изменился со времени написания этих строк, и что бедные программеры, так же как и мы когда-то, по-прежнему каждый день сталкиваются с проблемой русификации бесчисленного множества всевозможных программ, пакетов и библиотек. Но это ничего - старайся во всем видеть позитив. Покуда процесс разработки и сопровождения программ не низвели до уровня тривиального занятия, доступного домашним хозяйкам и гламурным девицам (скажу тебе по секрету, что этого никогда не произойдет), ты всегда будешь сыт, обут, одет, и сможешь раз в год ездить купаться в Египет. А может, и целых два.

Но вернемся на землю. Отпуск еще не скоро, а проблему надо решать сегодня. Итак, у нас есть процесс сборки, который выполняется Ant'ом. Все работает очень хорошо, да вот беда: русские буквы в выходных файлах сохраняются в виде знаков вопроса: "??????, ???". Ты, конечно, уже догадался, что это строчка из русифицированной версии программы HelloWorld smile

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

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

Так вот, я накорябал простенький build.xml, который коннектился к базе по JDBC и скачивал данные, архивные по природе, чтобы их можно было в любой момент поднять и поглядеть, чего в них есть интересного. Как ты уже догадался, дружок, кириллические символы в этом файле заменялись закорючками, и это меня активно не устраивало. В документации по SQL Task по этому поводу ничего обнадеживающего также не обнаружилось.

Тогда я скачал сырцы Apache Ant. Как там индустрия открытых сырцов, жива еще? Ну и хорошо, я так и думал. Да, значить. Скачал и смотрю, что за открытие выходного файла отвечат примерно такой код:

Код

PrintWriter writer = new PrintWriter(new FileOutputStream(filename));


Эге-ге - сказал я себе и почесал затылок, - да вам, братцы, видать, невдомек, что кроме английского бывают и другие языки. Сановцы - те знают, потому как у них там в девелопменте индус на китайце сидит и русским погоняет. Потому-то и предусмотрен у них специальный конструктор: public PrintWriter(OutputStream out, String encoding).

Ну да ладно. Невдомек так невдомек. Какая у нас используется кодировка, если не указано явно? Та, которая по умолчанию. Какая именно - зависит от платформы, локали и реализации JVM. Можно ли ее переопределить? Да, можно. Для этого надо выставить системную пропертю file.encoding. Делается это заданием аргументов командной строки при запуске Java: -Dfile.encoding=Cp1251.

Теперь надо выяснить, как это сделать в командной строке, которая вызывает Ant. Если ты думаешь, что для это служит опция -D, то как раз и ошибешься, точно так же как и я. Это они специально, чтобы нас с тобой с толку сбить. На самом деле опцией -D в командной строке Ant ты задаешь параметры, которые используются самим скриптом - для внутреннего, так сказать, пользования. Это для тех, кому в лом писать

Код

<property name="some.name" value="some value">


А опции JVM на самом деле задаются переменной окружения ANT_OPTS. Поэтому ты в своем батнике (или shell файле, если ты линуксоид) напиши примерно такое:

Код

set ANT_OPTS=-Dfile.encoding=Cp1251
ant


И будет тебе щастье!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)