ワークスペース、プロジェクト、ファイル全体のエンコーディングをUTF-8エンコーディングに変更するという名誉ある任務があります。 Unicodeで特別な文字をコーディングするために使用されるいくつかのResourcebundleがあります。また、UTF-8に切り替えて、そのUnicodeを削除したかったので、Resourcebundles(.properties)ファイルのエンコードも変更し、Unicode文字を置き換えました。
ドイツのリソースバンドルや次のような文字もあります
Ä、Ö、Ü、ß。 ä、ö、ü、および「」や「」などの特殊文字
ブラウザに正しく表示されません。例:
Resourcebundleentry:
executeShellCommand.label =Shellkommandoausführen
ブラウザでの結果:
リソースバンドルは、Java.util.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の出力を確認すると、次のようになります。getLocalizedString, key: executeShellCommand.label, resourcebundle: Shellkommando ausführen
getString(key)メソッドは読み取り中に文字のエンコーディングを変更するようですそれらをバンドルから標準のリソースバンドルエンコーディング(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()-メソッドがエンコーディングを変更するのを防ぐ方法を知っていますか、それともこの問題を解決するためのより良い方法がありますか?
JavaResourceBundlesはISO-8859を想定しています。 ResourceBundleの代わりにPropertiesを使用する必要があると思います。
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);