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 を使用する場合、.properties
Java ベースのプロジェクトでファイルを作成し、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());