2008-10-11 5 views
2

Я экспериментирую с интернационализацией, создав программу Hello World, которая использует файлы свойств + ResourceBundle для получения разных строк.Как правильно хранить и извлекать интернационализированные строки в файлах свойств?

В частности, у меня есть файл «messages_en_US.properties», в котором хранится «hello.world = Hello World!», Который отлично работает.

У меня тогда есть файл «messages_ja_JP.properties», с которым я пробовал всевозможные вещи, но он всегда отображается как некоторый тип искаженной строки при печати на консоли или в Swing. Очевидно, что проблема заключается в чтении содержимого в строку Java, поскольку строка Java в японском языке, введенная непосредственно в исходный код, может печатать в порядке.

Что я пробовал:

  • .properties файл в UTF-8 кодировке с японской строки как есть для значения. Что-то, что я читаю, указывает, что Java ожидает, что файл свойств будет в исходной кодировке системы ...? Это не сработало.
  • Файл в кодировке по умолчанию (ISO-8859-1) и значение, сохраненное как экранированный Unicode, созданный программой native2ascii, включенной в Java. Пробовал с исходным файлом в различных японских кодировках ... SHIFT-JIS, EUC-JP, ISO-2022-JP.

Edit:

Я действительно понял это, когда я печатаю это, но я полагал, что я отправлю его в любом случае, и ответить на него в случае, если это помогает любому.

ответ

2

Я понял, что native2ascii предполагал (удивляет), что он каждый раз переводил из моей стандартной кодировки операционной системы и, как таковой, не создавал правильную escape-строку Unicode.

Запуск native2ascii с «-Кодирование encoding_name» вариант, где encoding_name было имя кодировки исходного файла (SHIFT-JIS в данном случае) производится правильный результат и все работает отлично.

У Ant также есть задача native2ascii, которая запускает native2ascii по набору входных файлов и отправляет выходные файлы там, где вы хотите, поэтому я смог добавить создателя, который делает это в Eclipse, чтобы моя исходная папка имела строки в своих оригинальное кодирование для удобного редактирования и создания автоматически помещает преобразованные файлы с тем же именем в выходную папку.

0

Альтернативный способ обработки файлов свойств является: http://www.unipad.org/main/

Это редактор, который может читать/записывать файлы в \ у UNICODE избежать формат, это формат native2ascii создает.

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

1

С JDK 1.6 Свойства имеют метод load(), который принимает Reader. Это означает, что вы можете сохранить все файлы свойств как UTF-8 и прочитать их все напрямую, передав InputStreamReader для загрузки(). Я думаю, что это самое элегантное решение, но для этого требуется, чтобы ваше приложение запускалось на Java 6.

Исторически, load() принимал только InputStream, а поток был декодирован как ISO-8859-1.Не Системная кодировка по умолчанию, всегда ISO-8859-1. Это важно, потому что это делает возможный взлом. Скажем, файл свойств хранится как UTF-8. После получения свойства, вы можете перекодировать его в ISO-8859-1 и декодировать его снова, как UTF-8, как это:

String realProp = new String(prop.getBytes("ISO-8859-1"), "UTF-8"); 

Это некрасиво и хрупким, но это работает. Но я думаю, что лучшим решением, по крайней мере в течение следующих нескольких лет, является тот, который вы нашли: массовое преобразование файлов с помощью native2ascii с помощью инструмента построения, такого как Ant.

+0

Хмм, только для этого требуется, чтобы я создал функциональность, чтобы зеркально отразить способность фабричных методов ResourceBundle получить точное имя файла на основе локали, вместо того, чтобы просто дать ему базовое имя и дать ему понять остальное , получить входной поток и т. д. – ColinD 2008-10-12 02:17:30