Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кодировкой в Ant 
:(
    Опции темы
AntonSaburov
Дата 11.11.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



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

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

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

Но вернемся на землю. Отпуск еще не скоро, а проблему надо решать сегодня. Итак, у нас есть процесс сборки, который выполняется 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


И будет тебе щастье!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.