Свойства Java UTF-8 в Eclipse

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

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

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.

Ответ 2

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

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

EDIT: Как заметил Лоуренс в комментариях, 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();
}

Ответ 3

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

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

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

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

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

Ответ 4

Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

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

: -)

Ответ 5

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

EF BF BD - это кодированная UTF-8 форма U+FFFD, стандартного символа замены, который вставлен декодерами, когда они сталкиваются с некорректным вводом. Похоже, что ваш текст сохраняется как ISO-8859-1, затем читается так, как если бы он был UTF-8, а затем сохранялся как UTF-8, а затем преобразовывался в формат "Свойства" с помощью native2ascii с использованием кодировки по умолчанию платформы (например, окна-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", это не так полезно, как вы ожидали. Вместо этого в привычку всегда указывать кодировку при чтении и записи текстовых файлов.

Ответ 6

Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

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

Ответ 7

Существует гораздо более простой способ:

props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));

Ответ 9

Это, похоже, работает только для некоторых персонажей... включая специальные символы для немецкого, португальского, французского. Однако я столкнулся с проблемами с русскими, хинди и мандаринами. Они не преобразуются в формат свойств 'native2ascii', вместо этого сохраняются с помощью?????
Единственный способ получить мое приложение для правильного отображения этих символов - это поместить их в файл свойств, переведенный в формат UTF-8 - как \u0915 вместо क, или \u044F вместо я. Любые советы?

Ответ 10

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

Ответ 11

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

String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8");

Ответ 12

Если свойства для XML или HTML, безопаснее использовать XML-сущности. Они уродливее читать, но это означает, что файл свойств можно рассматривать как прямой ASCII, поэтому ничего не будет искажено.

Обратите внимание, что HTML имеет сущности, которые не имеют XML, поэтому я держу их в безопасности, используя прямой XML: http://www.w3.org/TR/html4/sgml/entities.html