Мне нужно создать файлы свойств i18n для нелатинских языков (упрощенный китайский, японский кандзи и т. Д.). В части Swing нашего продукта мы используем файлы свойств Java с необработанными символами UTF-8 в них, которые Netbeans автоматически преобразует в 8859-1 у нас, и работает нормально. С JavaFX эта стратегия не работает. Наша стратегия точно соответствует этому ответу, который, похоже, в данном случае не работает.

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

Чтобы устранить как можно больше переменных, я создал образец проекта FXML, чтобы проиллюстрировать проблему. На японских кандзи есть три интернационализированных метки. Первая метка содержит текст из документа FXML. Второй загружает необработанный неэкранированный символ из файла свойств. Третий загружает экранированный Unicode (соответствующий вывод native2ascii).

jp_test.properties

btn.one=閉じる
btn.two=\u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039

jp_test.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?scenebuilder-preview-i18n-resource jp_test.properties?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="147.0" prefWidth="306.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <Label layoutX="36.0" layoutY="33.0" text="閉じる" />
    <Label layoutX="36.0" layoutY="65.0" text="%btn.one" />
    <Label layoutX="36.0" layoutY="97.0" text="%btn.two" />
    <Label layoutX="132.0" layoutY="33.0" text="Static Label" textFill="RED" />
    <Label layoutX="132.0" layoutY="65.0" text="Properties File Unescaped" textFill="RED" />
    <Label layoutX="132.0" layoutY="97.0" text="Properties File Escaped" textFill="RED" />
  </children>
</AnchorPane>

Результат

Help me fix the third label

Как видите, третья метка отображается некорректно.

Окружающая среда:

Java 7 u21, u27, u45, u51, 32-разрядная и 64-разрядная версии. (JavaFX 2.2.3-2.2.45)

Windows 7 Enterprise, Professional, 64-разрядная.

ОБНОВЛЕНИЕ

Я проверил, что файлы свойств соответствуют ISO 8859-1.

enter image description here

3
mawcsco 13 Мар 2014 в 18:29

2 ответа

Лучший ответ

Большинство IDE (по крайней мере, NetBeans) по умолчанию обрабатывают файлы в кодировке Unicode. Если вы создаете файлы свойств в NetBeans и вводите в них текст на японском языке, то введенный текст будет автоматически закодирован в utf. Чтобы увидеть это, откройте файл свойств с помощью блокнота (++), вы увидите, что японские символы экранированы.
Эквивалент "閉じる" в экранированном формате utf - это "\u9589\u3058\u308b", тогда как "\u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039" - "é–‰ã�˜ã‚‹" на обратной стороне. Значит, вывод программы на картинке правильный. Кроме того, если вы повторно откроете файл jp_test.properties в NetBeans, вы увидите, что экранированные тексты в кодировке utf будут считаться декодированными.

РЕДАКТИРОВАТЬ: согласно комментарию,
Почему он это делает?
Возможно, из-за того, что вы опускаете параметр -encoding в native2ascii, тогда кодировка по умолчанию в вашей системе может не быть UTF. Возможно, это причина того вывода.

Кроме того, почему у Java и Swing нет проблем с нашими файлами свойств, как они есть,
но FXML не может с этим справиться?

Этого не может быть, потому что «FXML - это Java». Единственная разница также может заключаться в «использовании системной кодировки» по сравнению с «заменой кодировки в некотором месте конфигурации».

В любом случае, я предлагаю использовать правильный параметр кодировки native2ascii в соответствии с кодировкой входных файлов. В частности, сначала преобразуйте файлы свойств в кодировку utf-8, а затем сделайте все остальное. Если вы используете NetBeans в качестве IDE, то native2ascii не нужен.

1
Uluk Biy 14 Мар 2014 в 20:56
Таким образом, \u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039 принадлежит инструменту native2ascii Java, выполненному на 閉じる. Почему это происходит? Кроме того, почему у Java и Swing нет проблем с нашими файлами свойств, как они есть, а FXML не может с этим справиться?
 – 
mawcsco
14 Мар 2014 в 17:56
Итак, вы указали мне правильное направление. В файлах, которые мы получили от нашего переводчика, отсутствовала спецификация. После добавления спецификации как Netbeans, так и native2ascii генерируют правильные экранированные символы.
 – 
mawcsco
14 Мар 2014 в 21:57

Файлы свойств должны иметь кодировку ISO 8859-1, а не UTF-8.

Символы можно экранировать с помощью \uXXXX.

Такие инструменты, как NetBeans, делают это по умолчанию, AFAIK.

http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

http://docs.oracle.com/javase/tutorial/i18n/text/convertintro.html

0
Puce 14 Мар 2014 в 12:55
Файл является ISO 8859-1. Я отредактировал свой вопрос с этой информацией.
 – 
mawcsco
14 Мар 2014 в 18:09