Свойства Java в кодировке UTF-8 в Eclipse - PullRequest
48 голосов
/ 14 мая 2009

Мне недавно пришлось сменить кодировку веб-приложения, над которым я работаю, со ISO-xx на utf8. Все прошло гладко, кроме файлов свойств. Я добавил -Dfile.encoding=UTF-8 в eclipse.ini и нормальные файлы работают нормально. Однако свойства показывают странное поведение.

Если я скопирую закодированные utf8 свойства из Notepad ++ и вставлю их в Eclipse, они будут отображаться и работать нормально. Когда я снова открываю файл свойств, я вижу некоторые символы Юникода вместо правильных, например:

Zur\u00EF\u00BF\u00BDck instead of Zurück

но приложение все еще работает нормально. Если я начну редактировать свойства, добавлю некоторые специальные символы и сохраню их, они отображаются правильно, однако они не работают и все ранее работающие специальные символы больше не работают.

Когда я сравниваю локальную версию с CVS, я правильно вижу специальные символы в удаленном файле, и после обновления я снова запускаюсь: приложение работает, но Eclipse отображает символы Unicode.

Я попытался изменить кодировку файла, щелкнув по нему правой кнопкой мыши и выбрав «Другое: UTF8», но это не помогло. Также сказано: «определено по содержанию: ISO-8859-1»

Я использую Java 6 и Jboss Developer на основе Eclipse 3.3

Я могу жить с этим, отредактировав свойства в Notepad ++ и вставив их в Eclipse, но я был бы признателен, если бы кто-нибудь помог мне исправить это в Eclipse.

Ответы [ 12 ]

64 голосов
/ 14 мая 2009

Файлы свойств по ISO-8859-1 по определению - см. Документы для Свойства класса.

Spring имеет замену, которая может загружаться с указанной кодировкой, используя PropertiesFactoryBean.

РЕДАКТИРОВАТЬ: Как отметил Лоренс в комментариях, Java 1.6 ввел перегрузки для load и store, которые принимают Reader / Writer. Это означает, что вы можете создать считыватель для файла с любой кодировкой и передать его в load. К сожалению, FileReader все же не позволяет вам указать кодировку в конструкторе (aargh), так что вы застрянете в цепочках FileInputStream и InputStreamReader. Тем не менее, это будет работать.

Например, чтобы прочитать файл с использованием UTF-8:

Properties properties = new Properties();
InputStream inputStream = new FileInputStream("path/to/file");
try {
    Reader reader = new InputStreamReader(inputStream, "UTF-8");
    try {
        properties.load(reader);
    } finally {
        reader.close();
    }
} finally {
   inputStream.close();
}
54 голосов
/ 07 декабря 2009

Не тратьте свое время, вы можете использовать Плагин Resource Bundle in Eclipse

Basic Screen Shot

Старая страница Sourceforge

12 голосов
/ 14 мая 2009

Это не проблема с Eclipse. Если вы используете класс Properties для чтения и сохранения файла свойств, класс будет экранировать все специальные символы.

Из документации класса:

При сохранении свойств в поток или загрузке их из потока используется кодировка символов ISO 8859-1. Для символов, которые не могут быть непосредственно представлены в этой кодировке, используются экранированные символы Юникода; однако в escape-последовательности допускается только один символ 'u'. Инструмент native2ascii можно использовать для преобразования файлов свойств в другие кодировки и из них.

Из API, метод store ():

Символы меньше \ u0020 и символы больше \ u007E записываются как \ uxxxx для соответствующего шестнадцатеричного значения xxxx.

10 голосов
/ 15 июня 2010
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

Работает как шарм

: -)

4 голосов
/ 21 ноября 2012

Есть гораздо более простой способ:

props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));
4 голосов
/ 26 октября 2010
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

это хорошо работает в Java 1.6. Как я могу сделать это в 1.5, так как класс свойств не имеет метода для парс InputStreamReader.

4 голосов
/ 15 мая 2009

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

EF BF BD - это кодированная в UTF-8 форма U+FFFD, стандартного заменяющего символа, который вставляется декодерами при обнаружении некорректного ввода. Похоже, ваш текст сохраняется как ISO-8859-1, затем читается как UTF-8, затем сохраняется как UTF-8, а затем преобразуется в формат свойств с использованием native2ascii с использованием кодировки по умолчанию платформы (например, Windows-1252).

ü              => 0xFC                // save as ISO-8859-1
0xFC           => U+FFFD              // read as UTF-8
U+FFFD         => 0xEF 0xBF 0xBD      // save as UTF-8
0xEF 0xBF 0xBD => \u00EF\u00BF\u00BD  // native2ascii

Я предлагаю вам оставить свойство file.encoding в покое. Как и «file.separator» и «line.separator», это не так полезно, как можно было бы ожидать. Вместо этого имейте привычку всегда указывать кодировку при чтении и записи текстовых файлов.

3 голосов
/ 15 февраля 2011

Просто еще один плагин Eclipse для * .properties файлов:

Редактор свойств

1 голос
/ 09 июля 2014

Вы можете определить UTF-8 .properties файлы для хранения ваших переводов и использовать ResourceBundle, чтобы получить значения. Чтобы избежать проблем, вы можете изменить кодировку:

String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8");
1 голос
/ 11 октября 2011

Я рекомендую вам использовать Attesoro (http://attesoro.org/). Прост и удобен в использовании. И сделан в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...