прочитайте resourcebundle как UTF-8. метод getString (), похоже, меняет кодировку на ISO-8859
у меня есть почетное задание изменить кодировку нашего полного рабочего пространства, проектов и файлов на кодировку UTF-8. У нас есть несколько Resourcebundles, которые использовали для кодирования специальных символов с unicode. Мы также хотели избавиться от этого материала unicode, переключившись на UTF-8, поэтому я изменил кодировку Resourcebundles (.свойства) файлы тоже и заменили символы Unicode.
У нас также есть немецкие resourcebundles и некоторые символы, как
Ä, Ö, Ü, ß. ä, ö, ü, а также специальные символы, такие как " или "
не отображаются должным образом в браузере. Пример:
Resourcebundleentry:
executeShellCommand.label = Shellkommando ausführen
результат в браузере:
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;
}
}
это помогло восстановить самые специальные символы, но есть еще много из них, которые не отображаются должным образом:
Я также проверил содержимое-тип конфигурация 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);