Мне нужно создать файлы свойств 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>
Результат
Как видите, третья метка отображается некорректно.
Окружающая среда:
Java 7 u21, u27, u45, u51, 32-разрядная и 64-разрядная версии. (JavaFX 2.2.3-2.2.45)
Windows 7 Enterprise, Professional, 64-разрядная.
ОБНОВЛЕНИЕ
Я проверил, что файлы свойств соответствуют ISO 8859-1.
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 не нужен.
Файлы свойств должны иметь кодировку 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
Похожие вопросы
Связанные вопросы
Новые вопросы
unicode
Unicode - это стандарт кодирования, представления и обработки текста с целью поддержки всех символов, необходимых для письменного текста, включая все системы письма, технические символы и знаки препинания.
\u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039
принадлежит инструментуnative2ascii
Java, выполненному на閉じる
. Почему это происходит? Кроме того, почему у Java и Swing нет проблем с нашими файлами свойств, как они есть, а FXML не может с этим справиться?