7

重複の可能性:
ResourceBundleを使用してリソースプロパティでUTF-8を使用する方法

JavaSwingアプリケーションの国際化を許可したいと思います。バンドルファイルを使用して、すべてのラベルをその中に保持します。

テストとして、スウェーデン語のタイトルをに設定しようとしましたJButton。だから私が書いたバンドルファイルに:

nextStepButton=nästa

そして私が書いたJavaコードで:

nextStepButton.setText(bundle.getString("nextStepButton"));

ただし、ボタンのタイトル文字は実行時に間違って表示されます。
代替テキスト

UnicodeをサポートするTahomaフォントを使用しています。コードを使用してボタンのタイトルを手動で設定すると、正常に表示されます。

nextStepButton.setText("nästa");

バンドルファイルで失敗する理由はありますか?

-------------------------------------------->編集:タイトルのエンコード:
次のコードを使用して、バンドルファイルからのテキストをエンコードしてみました。

nextStepButton.setText(new String(bundle.getString("nextStepButton").getBytes("UTF-8")));

それでも結果は次のとおりです。
代替テキスト

4

3 に答える 3

9

javadocに従って、プロパティファイルはISO-8859-1を使用して読み取られます。

..入力/出力ストリームはISO8859-1文字エンコードでエンコードされます。このエンコーディングで直接表現できない文字は、Unicodeエスケープを使用して記述できます。エスケープシーケンスでは、単一の「u」文字のみが許可されます。native2asciiツールを使用して、プロパティファイルを他の文字エンコードとの間で変換できます。

native2asciiツールを使用してUTF-8プロパティファイルをISO-8859-1プロパティファイルに変換する以外に、カスタムを使用してResourceBundle.Control、プロパティファイルの読み込みを制御し、そこでUTF-8を使用することもできます。キックオフの例は次のとおりです。

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

このようにして、native2asciiツールに煩わされる必要がなく、保守しやすいプロパティファイルができあがります。

参照:

于 2010-12-13T13:29:04.947 に答える
6

Java国際化FAQをご覧ください。ファイルにASCII以外の文字を入れた場合は、 native2asciiツール.propertiesを使用して変換する必要があります。その後、すべてが機能するはずです。

于 2010-12-13T12:44:06.673 に答える
3

問題は、リソースバンドルプロパティファイルがUTF-8でエンコードされているのに、アプリケーションがLatin-1を使用してロードしていることです。

「LATINSMALLAWITH DIAERESIS」(Latin-1のE4またはUnicodeコードポイントとして0000E4)を取得し、それをUTF-8として表すと、C3A4が得られます。次に、それらをラテン1バイトとして扱うと、「LATIN CAPITAL LETTER A WITH TILDE」と、正方形の「CURRENCY SIGN」文字が表示されます。これは、ボタンのスクリーンショットに文字がどのように表示されているかを示しています。

(ちなみに、これは間違った文字エンコードを使用した結果として得られるマングリングの造語です...文字化け。会話でそれを使用して友達を困惑させます。)

于 2010-12-13T12:59:33.197 に答える