1

theProperties.properties という UTF-8 としてエンコードされたプロパティ ファイルがあります。

property1=Some Chinese Characters: 会意字會意字
property2=More chinese Char - 假借
property2=<any other valid UTF-8 characters>

リソース バンドルを使用して、ローカライズされた文字列を取り込みます。

ResourceBundle localizedStrings = ResourceBundle.getBundle(
    "theProperties.properties",
    locale
);

リソース バンドルは、すべての文字列が ISO-8859-1 であると想定しています。私のリソース ファイルは UTF-8 としてエンコードされています。文字列を UTF-8 に変換する必要があります

リソース バンドルをラップして、次のように文字列を引き出すのは安全ですか。

public String getLocalizedString(String key){
    String localizedString_ISO_8859_1 = localizedStrings.getString(key);
    String localizedString_UTF_8 = new String(localizedString_ISO_8859_1.getBytes("ISO-8859-1"), "UTF-8");
    return localizedString_UTF_8;
}

このコードが安全でない場合はありますか? 安全ではないように感じますが、文字列は不変です。それは、その下のバイトも不変であることを意味しますか?

これを行う方法は他にもありますが、この方法の方が短いので、安全である場合はこれを使用することをお勧めします。


これは、この問題を解決する別の方法ですが、もう少し長く、読みやすさの観点から、この解決策は Control クラスの 1 行を変更するだけなので、上記の方が気に入っています。

4

3 に答える 3

0

それは機能するはずですが、大きなコメントが必要なすべてを曲げるほど醜いです。

次のように機能します。

  • UTF-8 マルチバイト文字列のすべてのバイトは、Java によって char として取得されます。
  • その文字列を ISO-8859-x バイトに変換すると、すべての文字がバイトになります。
  • これらのバイトを UTF-8 として解釈すると、正しい解釈が得られます。

mavenのようなビルド インフラストラクチャがある場合は、エンコーディングを src からビルド ディレクトリに変換するプラグインがあります。

また、wysiwig 編集を備えた .properties エディターもあります。

最もクリーンなのは、独自のListResourceBundle子などを作成することかもしれません。単に.propertiesを(ab)使用しないでください。使用例については、JRE を参照してください。

于 2013-12-02T18:50:59.570 に答える
0

それはあなたのやり方でうまくいくはずです、ここに理由があります:

Java がプロパティ ファイルのバイトを読み取って解釈するとき、符号なしバイト値を char 値として使用するだけです。幸いなことに、最初の 256 コード ポイントは Unicode で同じエンコーディングを持ち、文字列は内部的にUTF-16、代理文字やその他の複雑なものは必要ありません。したがって、ISO-8859 であるふりをしたバイトとの間の変換は、損失なく機能します。

于 2013-12-02T18:51:16.130 に答える
0

ISO-8859-1 では、バイトとその文字セットの間に 1 対 1 のマッピングがあるため、これで問題ありません。

byte[]が必要なのに を使用せざるを得ない場合はいつでもString、マッピングとして ISO-8859-1 を使用する必要があります。

于 2013-12-02T19:26:17.503 に答える