2009-09-01 4 views
3

Могу ли я использовать java.util.Properties с кодировкой, отличной от значения по умолчанию?java.util.Properties и Cp1250

+1

Из любопытства: зачем вам это нужно? Вы нарушаете предположения всех разумных инструментов, которые обрабатывают файлы .properties. –

+0

Я использую файл свойств как карту, записанную на диск. – IAdapter

+0

+1 для полезного вопроса – KLE

ответ

3

Не, если вы

  1. работают Java 6 или более поздней версии
  2. контроль код загрузки файла свойств, и может использовать устройство для чтения. См. the javadoc.

Это довольно неприятный недостаток в спецификации. Существует несколько обходных путей, возможно, самым простым из них является автоматическое создание файла совместимости, совместимого с unicode, с соответствующим кодом (cp1250, utf-8, whatever).

Java поставляется с транскодером под названием native2ascii, чтобы сделать это для вас:

Есть некоторые в возрасте RFEs по этой теме:

+0

Хотя это может рассматриваться как недостаток спецификации, я думаю, что хорошо, что кодировка файла .properties хорошо известна и специфицирована в спецификации, а не как переменная, определены. –

+0

Мы, безусловно, согласны с тем, что хорошо, что спецификация определяет кодировку. Плохо, что спецификация не определяла широкоформатную кодировку, такую ​​как utf-8, или метод динамического переключения кодирования в начале файла, например. XML – djsadinoff

+0

+1 для полезного ответа – KLE

5

Да, но тогда вы должны быть осторожны, чтобы использовать load() и store() методы, которые принимают Reader/Writer, и явно построить те, с помощью InputStreamReader/OutputStreamWriter с правильной кодировкой.

Это может быть невозможно в библиотеках, которые неявно используют файлы свойств.

Редактировать: Методы, описанные выше, были введены только в Java 1.6 - для более старых версий вам не повезло, как писал dsadinoff. не

1

Если ваш файл свойств доступен во время сборки, вы также можете преобразовать его в скрипт ant с помощью native2ascii Задача:

<property name="javac.source.encoding" value="Cp1250"/> 

<native2ascii src="${src.dir}" dest="${classes.dir}" 
    encoding="${javac.source.encoding}" 
    includes="**/*.properties"/>