Почему текст в шведском языке из разъема ресурсов, появляющийся как гибберский? [Дубликат

StackOverflow https://stackoverflow.com/questions/4428689

Вопрос

Возможный дубликат:
Как использовать UTF-8 в ресурсных свойствах с ResourceBundle

Я хочу разрешить интернационализацию моему заявлению Java Swing. Я использую файл пучка, чтобы держать все этикетки внутри него.

Как тест, я пытался установить шведский титул на JButton. Отказ Так что в Bundle File я писал:

nextStepButton=nästa

А в Java Code я писал:

nextStepButton.setText(bundle.getString("nextStepButton"));

Но название символов кнопки выглядит не так во время выполнения:
alt text

Я использую шрифт Tahoma, который поддерживает Unicode. Когда я устанавливаю название кнопки вручную через код, он выглядит нормально:

nextStepButton.setText("nästa");

Любая идея, почему это терпит неудачу в Bundle File?

--------------------------------------------> Редактировать: кодирование заголовка:
Я попробовал кодировать текст, исходящий из файла пучка, используя код:

nextStepButton.setText(new String(bundle.getString("nextStepButton").getBytes("UTF-8")));

И еще в результате есть:
alt text

Это было полезно?

Решение

В соответствии с 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», а площадь «Знак валюты» ... каким образом отображаются символы на вашем скриншоте кнопки !!

(Кстати, вот неологизм для поклонения, который вы получаете в результате использования неправильного кодирования персонажа ... мозибак. Отказ Разбивайте своих друзей, используя его в разговоре.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top