Java の を使用して、リソース プロパティで UTF-8 を使用する必要がありますResourceBundle
。プロパティファイルにテキストを直接入力すると、文字化けして表示されます。
私のアプリは Google App Engine で実行されます。
誰かが私に例を挙げてもらえますか? 私はこの仕事を得ることができません。
Java の を使用して、リソース プロパティで UTF-8 を使用する必要がありますResourceBundle
。プロパティファイルにテキストを直接入力すると、文字化けして表示されます。
私のアプリは Google App Engine で実行されます。
誰かが私に例を挙げてもらえますか? 私はこの仕事を得ることができません。
Java 9 以降、プロパティ ファイルはデフォルトで UTF-8 としてエンコードされ、ISO-8859-1 以外の文字を使用してもそのまま使用できるはずです。
ファイルが指定されたときResourceBundle#getBundle()
のカバーの下での使用。これは、デフォルトでこれらのプロパティ ファイルをロードするために使用されます。javadocによると、デフォルトでは ISO-8859-1 として読み取られます。PropertyResourceBundle
.properties
Properties#load(InputStream)
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 として保存する必要がある場合は、native2asciiツールを使用して変換する必要があります。 UTF-8 で保存されたプロパティ ファイルを ISO-8859-1 で保存されたプロパティ ファイルに変換します。このファイルでは、カバーされていないすべての文字が\uXXXX
フォーマットに変換されます。次の例では、UTF-8 でエンコードされたプロパティ ファイルtext_utf8.properties
を有効な ISO-8859-1 でエンコードされたプロパティ ファイルに変換しますtext.properties
。
native2ascii -エンコーディング UTF-8 text_utf8.properties text.properties
Eclipse などの適切な IDE を使用している場合.properties
、Java ベースのプロジェクトでファイルを作成し、Eclipse 独自のエディターを使用すると、これはすでに自動的に行われています。Eclipse は、ISO-8859-1 の範囲を超える文字を透過的に\uXXXX
フォーマットに変換します。以下のスクリーンショットも参照してください (下部の [プロパティ] タブと [ソース] タブに注意してください。クリックすると拡大します)。
ResourceBundle.Control
または、 を使用してプロパティ ファイルを UTF-8 として明示的に読み取るカスタム実装を作成することもできInputStreamReader
ます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());
ResourceBundle のインスタンスがあり、次の方法で String を取得できるとします。
String val = bundle.getString(key);
日本語表示の問題を次の方法で解決しました。
return new String(val.getBytes("ISO-8859-1"), "UTF-8");
ResourceBundle.Control
たとえば、プロパティ ファイルで cp1251 文字セットが使用されている場合、UTF-8 および新しい String メソッドを使用すると機能しません。
したがって、一般的な方法を使用することをお勧めします: Unicodeシンボルで書き込みます。このため:
IDEA -- 特別な「透過的なネイティブから ASCII への変換」オプションがあります ([設定] > [ファイル エンコーディング])。
Eclipse - プラグイン「Properties Editor」があります。別のアプリケーションとして機能します。
UTF-8 のリソースを含む resources.utf8 ファイルを作成し、次を実行するルールを設定します。
native2ascii -encoding utf8 resources.utf8 resources.properties
注意: Java <= 8 では、Java プロパティ ファイルは ISO 8859-1 でエンコードする必要があります。
ISO 8859-1 文字エンコーディング。このエンコーディングで直接表現できない文字は、Unicode エスケープを使用して記述できます。エスケープ シーケンスでは、単一の 'u' 文字のみが許可されます。
@see プロパティ Java Doc
それでも本当にこれをやりたい場合は、以下をご覧ください: Java properties UTF-8 encoding in Eclipse -- コード サンプルがいくつかあります。
Java 9以降:プロパティファイルはUTF-8でエンコードされているため、問題/疑いはないはずです
Java SE 9 では、プロパティ ファイルは UTF-8 エンコーディングでロードされます。以前のリリースでは、プロパティ リソース バンドルの読み込みに ISO-8859-1 エンコーディングが使用されていました。
http://sourceforge.net/projects/eclipse-rbe/
すでに述べたように、プロパティ ファイルは ISO 8859-1 でエンコードする必要があります。
上記の Eclipse IDE 用プラグインを使用して、Unicode 変換を行うことができます。
これは、Guava の優れたサポート ライブラリと try-with-resources コンストラクトを使用する Java 7 ソリューションです。最も単純な全体的なエクスペリエンスのために、UTF-8 を使用してプロパティ ファイルを読み書きします。
プロパティ ファイルを UTF-8 として読み取るには、次のようにします。
File file = new File("/path/to/example.properties");
// Create an empty set of properties
Properties properties = new Properties();
if (file.exists()) {
// Use a UTF-8 reader from Guava
try (Reader reader = Files.newReader(file, Charsets.UTF_8)) {
properties.load(reader);
} catch (IOException e) {
// Do something
}
}
プロパティ ファイルを UTF-8 として書き込むには:
File file = new File("/path/to/example.properties");
// Use a UTF-8 writer from Guava
try (Writer writer = Files.newWriter(file, Charsets.UTF_8)) {
properties.store(writer, "Your title here");
writer.flush();
} catch (IOException e) {
// Do something
}
Rod が提供するアプローチを使用しようとしましたが、すべてのアプリケーションで同じ回避策を繰り返さないという BalusC の懸念を考慮して、次のクラスを使用しました。
import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;
public class MyResourceBundle {
// feature variables
private ResourceBundle bundle;
private String fileEncoding;
public MyResourceBundle(Locale locale, String fileEncoding){
this.bundle = ResourceBundle.getBundle("com.app.Bundle", locale);
this.fileEncoding = fileEncoding;
}
public MyResourceBundle(Locale locale){
this(locale, "UTF-8");
}
public String getString(String key){
String value = bundle.getString(key);
try {
return new String(value.getBytes("ISO-8859-1"), fileEncoding);
} catch (UnsupportedEncodingException e) {
return value;
}
}
}
これを使用する方法は、通常の ResourceBundle の使用法と非常に似ています。
private MyResourceBundle labels = new MyResourceBundle("es", "UTF-8");
String label = labels.getString(key)
または、デフォルトで UTF-8 を使用する別のコンストラクターを使用できます。
private MyResourceBundle labels = new MyResourceBundle("es");
私の問題の価値があるのは、ファイル自体のエンコーディングが間違っていたことです。iconv を使用するとうまくいきました
iconv -f ISO-8859-15 -t UTF-8 messages_nl.properties > messages_nl.properties.new