283

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

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

誰かが私に例を挙げてもらえますか? 私はこの仕事を得ることができません。

4

17 に答える 17

402

Java 9 以降

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

Java 8 以前

ファイルが指定されたときResourceBundle#getBundle()のカバーの下での使用。これは、デフォルトでこれらのプロパティ ファイルをロードするために使用されます。javadocによると、デフォルトでは ISO-8859-1 として読み取られます。PropertyResourceBundle.propertiesProperties#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());

以下も参照してください。

于 2011-01-11T16:53:39.450 に答える
142

ResourceBundle のインスタンスがあり、次の方法で String を取得できるとします。

String val = bundle.getString(key); 

日本語表示の問題を次の方法で解決しました。

return new String(val.getBytes("ISO-8859-1"), "UTF-8");
于 2011-08-09T11:22:11.697 に答える
26

ResourceBundle.Controlたとえば、プロパティ ファイルで cp1251 文字セットが使用されている場合、UTF-8 および新しい String メソッドを使用すると機能しません。

したがって、一般的な方法を使用することをお勧めします: Unicodeシンボルで書き込みます。このため:

IDEA -- 特別な透過的なネイティブから ASCII への変換オプションがあります ([設定] > [ファイル エンコーディング])。

Eclipse - プラグインProperties Editorがあります。別のアプリケーションとして機能します。

于 2012-03-22T08:52:47.347 に答える
19

UTF-8 のリソースを含む resources.utf8 ファイルを作成し、次を実行するルールを設定します。

native2ascii -encoding utf8 resources.utf8 resources.properties
于 2011-01-11T17:06:18.500 に答える
9

注意: 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 エンコーディングが使用されていました。

( https://docs.oracle.com/javase/9​​/intl/internationalization-enhancements-jdk-9.htm#JSINT-GUID-9DCDB41C-A989-4220-8140-DBFB844A0FCA )

于 2011-01-11T16:38:59.157 に答える
5

http://sourceforge.net/projects/eclipse-rbe/

すでに述べたように、プロパティ ファイルは ISO 8859-1 でエンコードする必要があります。

上記の Eclipse IDE 用プラグインを使用して、Unicode 変換を行うことができます。

于 2011-01-11T16:59:19.387 に答える
3

これは、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
}
于 2014-03-20T15:25:55.750 に答える
2

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");
于 2016-05-04T23:35:27.697 に答える
2

私の問題の価値があるのは、ファイル自体のエンコーディングが間違っていたことです。iconv を使用するとうまくいきました

iconv -f ISO-8859-15 -t UTF-8  messages_nl.properties > messages_nl.properties.new
于 2014-12-02T02:35:12.813 に答える