2009-05-14 2 views
46

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

Если я копирую 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.

ответ

51

Не тратьте свое время, вы можете использовать Resource Bundle plugin в Затмения

Basic Screen Shot

Old Sourceforge page

+3

Это очень полезный плагин, спасибо за подсказку! Так плохо, что у него нет URL-адреса установки, но просто отбрасывать его в папку плагинов делает трюк. – chesterbr

+3

Использует ли это инструмент native2ascii для символов, отличных от юникода, или я должен вручную исключить символы Unicode? –

+0

@ baybora.oren: Я расширил .zip в плагине плагинов eclipse, но я не вижу никаких изменений в идее (я завершаю и перезапускаю eclipse). Любой намек? – Sefran2

62

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

Весна имеет замену, которая может загружаться с указанной кодировкой, используя 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(); 
} 
+5

В Java 1.6 вы можете использовать другие кодировки, используя методы, которые используют Reader/Writer вместо InputStream/OutputStream. –

+0

Более общее решение, чем в принятом ответе, поэтому лучше :) –

12

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

From the class documentation:

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

From the API, store() method:

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

+0

Я был просто skeet'd ... :( –

+3

NetBeans прекрасно отображает файлы свойств, у которых есть экраны \ uXXXX, и позволяет редактировать их с правильно отображаемыми символами UTF Почему не Eclipse? По-моему, это проблема с Eclipse. – ChrisB

+0

+1: такой квант утешения за то, что он был skeet'd. – rexford

4

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

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», это не так полезно, как вы ожидали. Вместо этого в привычку всегда указывать кодировку при чтении и записи текстовых файлов.

1

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

+0

Вы можете использовать файл org.springframework.context.support.RupoadableResourceBundleMessageSource от Spring, который поддерживает UTF- 8 файлов с закодированными свойствами. Мы используем Spring для управления переводами на английском, немецком, французском и китайском языках в веб-приложениях на основе весны-mvc. – rexford

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

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

:-)

+0

К сожалению, props.load, в 1.6, требует InputStream и конкретно указывает, что он ожидает старую школу ISO-8859-1 – 2011-10-09 15:35:11

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

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

-1

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

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

1

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

4

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

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

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

String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8"); 
Смежные вопросы