web-dev-qa-db-ja.com

resourcebundleをUTF-8として読み取ります。 getString()メソッドはエンコーディングをISO-8859に変更しているようです

ワークスペース、プロジェクト、ファイル全体のエンコーディングをUTF-8エンコーディングに変更するという名誉ある任務があります。 Unicodeで特別な文字をコーディングするために使用されるいくつかのResourcebundleがあります。また、UTF-8に切り替えて、そのUnicodeを削除したかったので、Resourcebundles(.properties)ファイルのエンコードも変更し、Unicode文字を置き換えました。

ドイツのリソースバンドルや次のような文字もあります

Ä、Ö、Ü、ß。 ä、ö、ü、および「」や「」などの特殊文字

ブラウザに正しく表示されません。例:

Resourcebundleentry:

executeShellCommand.label =Shellkommandoausführen

ブラウザでの結果: enter image description here

リソースバンドルは、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;
    }
}

これは、最も特殊な文字を回復するのに役立ちましたが、正しく表示されない文字がまだたくさんあります。

enter image description here

また、WebAppのコンテンツタイプ構成と、リソースバンドルを取得するすべてのリクエストのすべてがutf-8であることを確認しました。

誰かがgetString()-メソッドがエンコーディングを変更するのを防ぐ方法を知っていますか、それともこの問題を解決するためのより良い方法がありますか?

12
izocan

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);
11
lance-java

ハックはどうですか!!!

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);
0
lance-java