Почему текст в шведском языке из разъема ресурсов, появляющийся как гибберский? [Дубликат
-
09-10-2019 - |
Вопрос
Возможный дубликат:
Как использовать UTF-8 в ресурсных свойствах с ResourceBundle
Я хочу разрешить интернационализацию моему заявлению Java Swing. Я использую файл пучка, чтобы держать все этикетки внутри него.
Как тест, я пытался установить шведский титул на JButton
. Отказ Так что в Bundle File я писал:
nextStepButton=nästa
А в Java Code я писал:
nextStepButton.setText(bundle.getString("nextStepButton"));
Но название символов кнопки выглядит не так во время выполнения:
Я использую шрифт Tahoma, который поддерживает Unicode. Когда я устанавливаю название кнопки вручную через код, он выглядит нормально:
nextStepButton.setText("nästa");
Любая идея, почему это терпит неудачу в Bundle File?
--------------------------------------------> Редактировать: кодирование заголовка:
Я попробовал кодировать текст, исходящий из файла пучка, используя код:
nextStepButton.setText(new String(bundle.getString("nextStepButton").getBytes("UTF-8")));
И еще в результате есть:
Решение
В соответствии с javadoc., файлы свойств читаются с помощью ISO-8859-1.
.. входной / выходной поток закодирован в кодировке символов ISO 8859-1. Символы, которые не могут быть непосредственно представлены в этой кодировке, могут быть записаны с использованием Unicode Escapes; Только один символ «U» допускается в escape Sequence. Инструмент Nator2Ascii можно использовать для преобразования файлов свойств в и из других кодировков символов.
Помимо использования инструмента Anator2ascii для преобразования файлов свойств UTF-8 в файлы свойств ISO-8859-1 вы также можете использовать пользовательский ResourceBundle.Control
Так что вы можете контролировать загрузку файлов свойств и использовать там UTF-8. Вот пример Kickoff:
public class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// The below is a copy of the default implementation.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
// Only this line is changed to make it to read properties files as UTF-8.
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}
Используйте это следующим образом:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Таким образом, вам не нужно хлопотать с помощью инструмента Anator2Ascii, и вы в конечном итоге с лучшими файлами обслуживания свойств.
Смотрите также:
Другие советы
Взгляни на FAQ FAQ Java Internationalization. Отказ Если вы поместили символы не ASCII в вашем .properties
файл, вы должны преобразовать его, используя Native2ascii инструмент. Тогда все должно работать.
Проблема заключается в том, что файл свойств пакета ресурсов закодирован в UTF-8, но ваше приложение загружает его, используя латин-1.
Если вы возьмете «латинскую маленькую неисправность» (E4 на Latin-1 или 0000E4 в качестве Unicode CodePoint) и представляете его как UTF-8, вы получаете C3 A4. Если вы тогда относитесь к такого, как латин-1 байты, вы получаете «Латинскую столицу A с Tilde», а площадь «Знак валюты» ... каким образом отображаются символы на вашем скриншоте кнопки !!
(Кстати, вот неологизм для поклонения, который вы получаете в результате использования неправильного кодирования персонажа ... мозибак. Отказ Разбивайте своих друзей, используя его в разговоре.)