Ответ 1
Не тратьте свое время, вы можете использовать плагин Resource Bundle в 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.
Не тратьте свое время, вы можете использовать плагин Resource Bundle в Eclipse
Свойства файлов 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();
}
Это не проблема с Eclipse. Если вы используете класс "Свойства" для чтения и сохранения файла свойств, класс будет избегать всех специальных символов.
При сохранении свойств в потоке или их загрузке из потока используется кодировка символов ISO 8859-1. Для символов, которые не могут быть непосредственно представлены в этой кодировке, используются escape-последовательности Unicode; однако в escape-последовательности допускается только один символ "u". Инструмент native2ascii можно использовать для преобразования файлов свойств в другие кодировки символов и из других кодировок.
Символы меньше \u0020 и символы, большие, чем \u007E, записываются как \uxxxx для соответствующего шестнадцатеричного значения xxxx.
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
Работает как шарм
: -)
Слишком много точек в описываемом вами процессе, где могут возникать ошибки, поэтому я не буду пытаться угадать, что вы делаете неправильно, но я думаю, что знаю, что происходит под капотом.
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", это не так полезно, как вы ожидали. Вместо этого в привычку всегда указывать кодировку при чтении и записи текстовых файлов.
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
это хорошо работает в java 1.6. Как я могу это сделать в 1.5, так как класс свойства не имеет метода для пар InputStreamReader
.
Существует гораздо более простой способ:
props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));
Еще один плагин Eclipse для файлов *.properties:
Это, похоже, работает только для некоторых персонажей... включая специальные символы для немецкого, португальского, французского. Однако я столкнулся с проблемами с русскими, хинди и мандаринами. Они не преобразуются в формат свойств 'native2ascii', вместо этого сохраняются с помощью?????
Единственный способ получить мое приложение для правильного отображения этих символов - это поместить их в файл свойств, переведенный в формат UTF-8 - как \u0915 вместо क, или \u044F вместо я.
Любые советы?
Я рекомендую вам использовать Attesoro (http://attesoro.org/). Прост и удобен в использовании. И сделано в java.
Вы можете определить файлы UTF-8.properties для хранения ваших переводов и использовать ResourceBundle для получения значений. Чтобы избежать проблем, вы можете изменить кодировку:
String value = RESOURCE_BUNDLE.getString(key);
return new String(value.getBytes("ISO-8859-1"), "UTF-8");
Если свойства для XML или HTML, безопаснее использовать XML-сущности. Они уродливее читать, но это означает, что файл свойств можно рассматривать как прямой ASCII, поэтому ничего не будет искажено.
Обратите внимание, что HTML имеет сущности, которые не имеют XML, поэтому я держу их в безопасности, используя прямой XML: http://www.w3.org/TR/html4/sgml/entities.html