прочитайте resourcebundle как UTF-8. метод getString (), похоже, меняет кодировку на ISO-8859

у меня есть почетное задание изменить кодировку нашего полного рабочего пространства, проектов и файлов на кодировку UTF-8. У нас есть несколько Resourcebundles, которые использовали для кодирования специальных символов с unicode. Мы также хотели избавиться от этого материала unicode, переключившись на UTF-8, поэтому я изменил кодировку Resourcebundles (.свойства) файлы тоже и заменили символы Unicode.

У нас также есть немецкие resourcebundles и некоторые символы, как

Ä, Ö, Ü, ß. ä, ö, ü, а также специальные символы, такие как " или "

не отображаются должным образом в браузере. Пример:

Resourcebundleentry:

executeShellCommand.label = Shellkommando ausführen

результат в браузере: enter image description here

resourcebundles считываются с помощью Java.утиль.У resourcebundle.метод getString (String key):

    public String getLocalizedString(ResourceBundle bundle, String key) {
    try {
        System.out.println("getLocalizedString, key: " + key + ", resourcebundle: " + bundle.getString(key));
        return bundle.getString(key);
    } catch (MissingResourceException e) {
        return key;
    }
}

Если я проверю выход вышеуказанного Sysout i сделать следующее: getLocalizedString, key: executeShellCommand.label, resourcebundle: Shellkommando ausführen

кажется,метод getString(key) изменяет кодировку символов при чтении их от пакетов до стандартного resourcbundleencoding (ISO-8859).

Я попытался противостоять этой проблеме:

    public String getLocalizedString(ResourceBundle bundle, String key) {
    try {
        System.out.println("getLocalizedString, key: " + key + ", resourcebundle: " + new String (bundle.getString(key).getBytes(), "UTF-8"));
        return new String (bundle.getString(key).getBytes(), "UTF-8");
    } catch (MissingResourceException e) {
        return key;
    } catch (UnsupportedEncodingException e) {
        return key;
    }
}

это помогло восстановить самые специальные символы, но есть еще много из них, которые не отображаются должным образом:

enter image description here

Я также проверил содержимое-тип конфигурация WebApp и каждого отдельного запроса, который получает пакеты ресурсов, - это utf-8.

есть ли у кого-нибудь идея, как запретить метод getString () - изменять кодировку или есть ли лучший способ решить эту проблему?

2 ответов


Java ResourceBundles предполагают ISO-8859. Я думаю, вам нужно будет использовать свойства вместо ResourceBundle.

InputStream utf8in = getClass().getClassLoader().getResourceAsStream("/path/to/utf8.properties");
Reader reader = new InputStreamReader(utf8in, "UTF-8");
Properties props = new Properties();
props.load(reader);

Как это для взлома!!!

public class HackClassLoader extends ClassLoader {

    public HackClassLoader(ClassLoader parent) {
        super(parent);
    }

    @Override
    public InputStream getResourceAsStream(String name) {
        InputStream utf8in = getParent().getResourceAsStream(name);
        if (utf8in != null) {
            try {
                byte[] utf8Bytes = new byte[utf8in.available()];
                utf8in.read(utf8Bytes, 0, utf8Bytes.length);
                byte[] iso8859Bytes = new String(utf8Bytes, "UTF-8").getBytes("ISO-8859-1");
                return new ByteArrayInputStream(iso8859Bytes);
            } catch (IOException ex) {
                throw new RuntimeException("Could not load " + name, e);
            } finally {
                utf8in.close();
            }
        }
        return null;
    }
}

ClassLoader hackLoader = new HackClassLoader(getClass().getClassLoader());
ResourceBundle bundle = ResourceBundle.getBundle("foo", Locale.UK, hackLoader);