ResourceBundle のリソース プロパティで UTF-8 を使用する方法 質問する

ResourceBundle のリソース プロパティで UTF-8 を使用する方法 質問する

Java を使用してリソース プロパティで UTF-8 を使用する必要がありますResourceBundle。プロパティ ファイルにテキストを直接入力すると、mojibake として表示されます。

私のアプリは Google App Engine 上で実行されます。

誰か例を挙げてもらえますか? この作業が理解できません。

ベストアンサー1

Java 9以降

Java 9以降プロパティ ファイルはデフォルトで UTF-8 としてエンコードされており、ISO-8859-1 以外の文字を使用してもすぐに使用できるはずです。

IDE を使用して編集する場合は、UTF-8 を使用して読み取るように IDE に再度指示する必要があるかもしれません。IntelliJ の設定でこれを行う方法は次のとおりです。

ここに画像の説明を入力してください

Eclipse の設定では次のようになります:

ここに画像の説明を入力してください

Java 8以前

ResourceBundle#getBundle()カバーの下の使用PropertyResourceBundleファイルが指定されると.properties、デフォルトでProperties#load(InputStream)これらのプロパティファイルをロードします。javadoc のデフォルトでは ISO-8859-1 として読み取られます。

public void load(InputStream inStream) throws IOException

入力バイト ストリームからプロパティ リスト (キーと要素のペア) を読み取ります。入力ストリームは、load(Reader) で指定されているように単純な行指向形式であり、ISO 8859-1 文字エンコーディング(各バイトが 1 つの Latin1 文字) を使用することが想定されています。Latin1 以外の文字と特定の特殊文字は、Java™ 言語仕様のセクション 3.3 で定義されているように、Unicode エスケープを使用してキーと要素で表されます。

したがって、ISO-8859-1として保存する必要があります。ISO-8859-1の範囲外の文字があり、\uXXXX頭から使用できず、ファイルをUTF-8として保存する必要がある場合は、ネイティブ2ASCIIUTF-8 で保存されたプロパティ ファイルを ISO-8859-1 で保存されたプロパティ ファイルに変換するツールです。このツールでは、カバーされていないすべての文字が\uXXXX形式に変換されます。以下の例では、UTF-8 でエンコードされたプロパティ ファイルtext_utf8.propertiesを有効な ISO-8859-1 でエンコードされたプロパティ ファイルに変換しますtext.properties

native2ascii -encoding UTF-8 text_utf8.properties text.properties

Eclipse や IntelliJ などの IDE を使用する場合、.propertiesJava ベースのプロジェクトでファイルを作成し、IDE 独自のプロパティ ファイル エディターを使用すると、これはすでに自動的に実行されます。ISO-8859-1 の範囲外の文字は透過的に\uXXXXフォーマットに変換されます。Eclipse の以下のスクリーンショットも参照してください (下部の [プロパティ] および [ソース] タブに注目してください。クリックすると拡大します)。

「プロパティ」タブ 「ソース」タブ

あるいは、カスタムResourceBundle.Control実装では、プロパティファイルをUTF-8として明示的に読み取ります。InputStreamReaderなので、 を気にせずに UTF-8 として保存することができますnative2ascii。以下はキックオフの例です:

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());

参照:

おすすめ記事