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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В какой кодировке Java читает файл? 
:(
    Опции темы
korob2001
Дата 3.10.2014, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 1
Всего: 61



Привет, всем!

Если вопрос не совсем корректно задан, извините - у меня уже голова квадратная. Опишу чуть подробнее суть проблемы.

Как-то мне довелось писать одну программу, она замечательно работала, пока не стал вопрос о том, что бы удовлетворить  русско-язычную публику. smile Программа занимается автоматической рассылкой почты для клиентов одной фирмы (письма активации учётных записей, подтверждения о покупке, информация о доставке и т.п.). Программа должна была отправлять письма в различных форматах, на разных языках. Я понимал, что со временем в неё нужно будет добавлять новые сообщения, потому решил писать её в стиле pluggable. В итоге получилось 2 jar архива (mail-plugin-api.jar - интерфейсы которые плагины должны реализовывать, MailService.jar - основная программа, интерфейс пользователя, загрузка плагинов и т.д.), так еже есть папка plugins куда помещаются сами плагины (тоже jar архивы). 

Так как формат писем у каждого плагина разный (под форматом я подразумеваю дизайн - оформление), каждый плагин содержит свои HTML шаблоны, примерно такого вида en_template.html, для каждого языка свой:
Код

<html>
    <body>
        <h2>Hello, @UserName!</h2>
        ...............
    </body>
</html>

Такие HTML файлы находятся внутри jar архива каждого плагина, когда программа с помощью плагина получает содержимое этого файла происходит подстановка спец. слов (таких как @UserName). Этот HTML файл в кодировке UTF-8. Вот так программа формирует и отправляет Email:
Код

private synchronized String sendHtmlEmail(Email email)
        throws EmailException, MalformedURLException {
    HtmlEmail mail = new HtmlEmail();
    mail.setCharset(EmailConstants.UTF_8);
    mail.addHeader("X-organization", email.getFrom().getName());
    mail.setHostName(settings.getString(SettingsKey.MailHost));
    mail.setFrom(email.getFrom().getEmail(), email.getFrom().getName());

    for (EmailAddress toAddress : email.getAllTo()) {
        mail.addTo(toAddress.getEmail(), toAddress.getName());
    }

    mail.setSubject(email.getSubject());
    mail.setHtmlMsg(mailer.getBodyForEmail(email));

    for (Attachment attachment : email.getAttachments()) {
        mail.attach(createAttachment(attachment));
    }
    return mail.send();
}

Отсюда видно, что кодировку устанавливаю первым делом, сразу же после создания объекта HtmlEmail, но если шаблон на русском языке, то приходит примерно такое:
Код

�?к�?иви�?�?й�?е ва�?�? �?�?�?�?н�?�? запи�?�?
Здрав�?твуйте [ЗДЕСЬ ИМЯ ПОЛЬЗОВАТЕЛЯ],
Вы у�?пешно зареге�?трированы на 

Если пишу например Subject прямо в коде, на русском языке, тогда он отображается как положено, но если читаю из файла, вложенного в jar плагина - результат можно видеть выше. ;(((((

Понимаю, что проблема с кодировкой. Если нужно привести ещё какую-то часть кода, то скажите какую именно, я приведу.

Заранее спасибо за помощь.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sgrey
Дата 5.10.2014, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



проблема скорее всего здесь в том, что файл сохранён не в юникоде, а в другой кодировке. Попробуй файл сохранить в UTF-8
PM MAIL   Вверх
Pawl
Дата 5.10.2014, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата

   но если читаю из файла, вложенного в jar плагина - результат можно видеть выше
   

Может, перед отправкой принудительно кодировать сообщение из файла в UTF-8? К примеру, так:
Код

String message = java.net.URLEncoder.encode(fileName, UTF-8);


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Pawl
Дата 5.10.2014, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Пардон, вместо fileName имелось ввиду, конечно, текстовое содержимое файла. Вообще, аргументы д. б. типа String, так что
Код

String message = java.net.URLEncoder.encode(fileContent, "UTF-8");


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
serger
Дата 7.10.2014, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 1
Всего: 5



Скорее всего двойное преобразование кодировок.
Почитайте:
http://skipy.ru/technics/encodings.html

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype GTalk Jabber   Вверх
korob2001
Дата 7.10.2014, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 1
Всего: 61



Спасибо, сейчас почитаю и завтра на работе буду пробовать. На работе, межу делом, загрузили другой работой, даже сюда зайти времени не было.

Добавлено через 5 минут и 56 секунд
Да, кстати, я забыл сразу написать. Писал я эту программу на своём ноутбуке, когда на нём её запускал, всё работало правильно. Я так понимаю из-за того, что локаль на нём русская была ru_RU, а когда перенёс приложение на сервер, где локаль нидерландская nl_BE. После чего пробовал явно указывать локаль, в зависимости от того, на каком языке шаблон, но всё равно не помогло.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 9.10.2014, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 1
Всего: 61



Доброе утро!

Почитал статью. Перевёл кодировку properties файлов назад в  iso-8859- , откуда так же берутся Тема письма и другая дополнительная информация, они так же находятся в jar плагина. Вот, примерно в таком виде:
Код

Subject=Активируйте вашу учётную запись
[email protected]
[email protected]
FromName=Informer
CcName=Имя человека, кому будет отправляться копия

Subject здесь на русском языке и то, что в properties файлах нужно использовать только кодировку iso-8859-1, а остальные символы нужно прописывать кодами \uXXXX, меня немного смутило. Дело в том, что я переводил кодировку этих файлов тоже в UTF-8 и в принципе программа читала эти файлы, пусть и не совсем правильно. Символы русского алфавита я всегда писал в properties файлы, без всяких кодов. В общем, полез я в проект с блокнотом и выяснилось, что это NetBeans переводил коды \uXXXX в символы и обратно симовлы в коды \uXXXX. Потому раньше для меня это всё происходило прозрачно, в смысле никаких кодов я никогда туда не писал.

Насколько я понимаю проблема в коде, который читает HTML шаблон из файла, т.е. где-то здесь.
Код

protected static String loadDefaultTemplate(String path) throws CanNotBeLoadException {
    StringBuilder result = new StringBuilder();
    try {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(
            Utilities.class.getClassLoader().getResourceAsStream(path)))) {
              
            String line;
            while ((line = br.readLine()) != null) {
                result.append(line);
            }
        }
    } catch (IOException ex) {
        throw new CanNotBeLoadException(ex);
    }
    return result.toString();
}

Попробовал изменить сделать так:
Код

try (BufferedReader br = new BufferedReader(new InputStreamReader(
    Utilities.class.getClassLoader().getResourceAsStream(path), "UTF-8"))) {
                
    String line;
    while ((line = br.readLine()) != null) {
        result.append(line);
    }
}

Т.е указал кодировку. Теперь получаю письмо в таком виде:
Код

Активируйте вашу учётную запись
Здрав�твуйте Mr. Denys Korobov,
Вы у�пешно Еареге�трированы на.
Чтобы вы могли Еайти в �и�тему, вы должны активи
ровать �вою учётную Еапи�ь. Дл� �того вам необходимо перейти
по �ледующей ��ылке.

Причём первая строка это Subject из properties файла, она так же присутствует и в теле письма. Вот она теперь отображается правильно, зато всё остальное, нет. ;((((

Это сообщение отредактировал(а) korob2001 - 9.10.2014, 12:40


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

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

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


 




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


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

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