なぜスウェーデン語のテキストは、リソースバンドルからギバッシュとして表示されるのですか? [複製
-
09-10-2019 - |
質問
Java Swingアプリケーションへの国際化を許可したいです。バンドルファイルを使用して、すべてのラベルを内部に保ちます。
テストとして、私はスウェーデンのタイトルをに設定しようとしました 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")));
それでも結果は次のとおりです。
解決
に従って Javadoc, 、プロパティファイルは、ISO-8859-1を使用して読み取られます。
..入力/出力ストリームは、ISO 8859-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ツールで手間をかける必要はなく、メンテナンス可能なプロパティファイルが優れていることになります。
参照:
他のヒント
を見てみましょう Java Internationalization FAQ. 。 ASCII以外のキャラクターを入れた場合 .properties
ファイルでは、を使用して変換する必要があります Native2ascii 道具。その後、すべてが機能するはずです。
問題は、リソースバンドルプロパティファイルがUTF-8でエンコードされているが、アプリケーションがLATIN-1を使用してロードしていることです。
「ダイアエレシスを備えたラテン語a」(ラテン-1のE4または0000E4をユニコードコードポイントとして服用し、UTF-8として表現すると、C3 A4を取得します。その後、それらをラテン語1バイトとして扱うと、「ラテン語の大文字のティルド」と正方形の「通貨サイン」文字が得られます...これは、ボタンのスクリーンショットにキャラクターが表示されている方法です!!
(ちなみに、これは間違ったキャラクターのエンコーディングを使用した結果として、あなたが得るマングルのための新学的主義です... モジバケ. 。会話でそれを使用して、友達を困惑させます。)