Могу ли я использовать java.util.Properties с кодировкой, отличной от значения по умолчанию?java.util.Properties и Cp1250
ответ
Не, если вы
- работают Java 6 или более поздней версии
- контроль код загрузки файла свойств, и может использовать устройство для чтения. См. the javadoc.
Это довольно неприятный недостаток в спецификации. Существует несколько обходных путей, возможно, самым простым из них является автоматическое создание файла совместимости, совместимого с unicode, с соответствующим кодом (cp1250, utf-8, whatever).
Java поставляется с транскодером под названием native2ascii, чтобы сделать это для вас:
Есть некоторые в возрасте RFEs по этой теме:
Хотя это может рассматриваться как недостаток спецификации, я думаю, что хорошо, что кодировка файла .properties хорошо известна и специфицирована в спецификации, а не как переменная, определены. –
Мы, безусловно, согласны с тем, что хорошо, что спецификация определяет кодировку. Плохо, что спецификация не определяла широкоформатную кодировку, такую как utf-8, или метод динамического переключения кодирования в начале файла, например. XML – djsadinoff
+1 для полезного ответа – KLE
Да, но тогда вы должны быть осторожны, чтобы использовать load()
и store()
методы, которые принимают Reader
/Writer
, и явно построить те, с помощью InputStreamReader/OutputStreamWriter
с правильной кодировкой.
Это может быть невозможно в библиотеках, которые неявно используют файлы свойств.
Редактировать: Методы, описанные выше, были введены только в Java 1.6 - для более старых версий вам не повезло, как писал dsadinoff. не
Если ваш файл свойств доступен во время сборки, вы также можете преобразовать его в скрипт ant с помощью native2ascii Задача:
<property name="javac.source.encoding" value="Cp1250"/>
<native2ascii src="${src.dir}" dest="${classes.dir}"
encoding="${javac.source.encoding}"
includes="**/*.properties"/>
Из любопытства: зачем вам это нужно? Вы нарушаете предположения всех разумных инструментов, которые обрабатывают файлы .properties. –
Я использую файл свойств как карту, записанную на диск. – IAdapter
+1 для полезного вопроса – KLE