6

開発のためResourceBundleに、IDEのリソースディレクトリからUTF-8でエンコードされたプロパティファイル(そのファイルのEclipseのファイルプロパティで設定)を直接読み取るために使用しています(native2asciiは本番環境で使用されます)。 :

menu.file.open.label=&Öffnen...
label.btn.add.name=&Hinzufügen
label.btn.remove.name=&Löschen

非ASCII文字を使用すると文字エンコーディングに問題が発生するため、次の方法で満足できると思いました。

ResourceBundle resourceBundle = ResourceBundle.getBundle("messages", Locale.getDefault());
String value = resourceBundle.getString(key);
value = new String(value.getBytes(), "UTF-8");

まあ、ドイツ語の小文字のウムラウトではうまく機能しますが、大文字のウムラウトではß機能しません。で読み取ったgetString(key)値と で変換した後の値は次のnew String(value.getBytes(), "UTF-8")とおりです。

&Löschen => &Löschen
&Hinzufügen => &Hinzufügen

&Ã?ber => &??ber
&SchlieÃ?en => &Schlie??en
&Ã?ffnen... => &??ffnen...

最後の 3 つは次のようになります。

&Ã?ber => &Über
&SchlieÃ?en => &Schließen
&Ã?ffnen... => &Öffnen...

私は真実からそれほど離れていないと思いますが、ここで何が欠けているのでしょうか?

Google は似たようなものを見つけましたが、それは未回答のままでした。

編集:もう少しコード

4

4 に答える 4

6

String.getBytes() 問題は、エンコーディングを指定せずに呼び出していることです。これにより、デフォルトのプラットフォームエンコーディングが使用されます。次に、その操作のバイナリ結果をUTF-8の場合と同じように使用します。

UTF-8を両方向で使用する場合は、問題ありません。

// Should be a round-trip
value = new String(value.getBytes("UTF-8"), "UTF-8");

...しかし、これを使用して、最初の読み取りを実行しているコードに通知せずにUTF-8でエンコードされたプロパティファイルを読み取ろうとした場合、それは機能しません。

あなたが提示したコードは基本的に常に間違ったアプローチです。あなたの「それは文字エンコードの問題を引き起こすので」はあなたが以前の問題にすでに遭遇したことを示唆しています-それで私は壊れた修正を適用しようとする代わりにそれに戻ります。を構築するときにすでにデータを失っている場合はResourceBundle、後で戻るには遅すぎます...ResourceBundleそれ自体が正しくロードされていることを確認する必要があります。

で発生した問題を正確に教えてくださいResourceBundle。根本的な原因を修正できるかどうかを確認できます。

編集:native2asciiをどのように実行しているかは明確ではありません。修正は、使用するように変更するのと同じくらい簡単かもしれません:

native2ascii -encoding UTF-8 input.properties output.properties
于 2012-09-03T19:56:49.767 に答える
3

いくつかのメモ:

  • である場合Stringは UTF-16 であり、そうでない場合は破損した文字列です (修正するには遅すぎます)。
  • new String(value.getBytes(), "UTF-8");- このコードは、デフォルトのエンコーディングとして UTF-8 を使用するシステムでは (せいぜい) 何もしません。そうしないと、文字列が破損します。
  • .properties ファイルは ISO 8859-1 でなければなりません (このPropertiesタイプは他の形式とエンコーディングをサポートしていますが、それをどのように伝えるかわかりませんResourceBundle)。
  • System.out独自のトランスコーディング バグが発生する可能性があります (PrintStreamは UTF-16 文字列をデフォルトのエンコーディングにエンコードします。受信デバイスは同じエンコーディングを使用してバイトをデコードする必要があります)。

間違った場所で問題を解決しようとしていると思われます。

于 2012-09-03T20:26:13.393 に答える
2

デコードに使用しているエンコードとは異なるエンコードでテキストをエンコードしています。

代わりに、エンコードとデコードに同じ文字セットを使用してみてください。

value = new String(value.getBytes("UTF-8"), "UTF-8");

String s = "ßßßßß";
s += s.toUpperCase();
s = new String(s.getBytes("UTF-8"), "UTF-8");
System.out.println(s);

プリント

ßßßßßSSSSSSSSSS
于 2012-09-03T19:57:46.633 に答える
0

今日、私は同僚の1人と話していましたが、彼は他の回答が述べたのとほぼ同じ道を進んでいました。そこで、Jon Skeetが述べたこと、つまり本番環境と同じファイルを作成することを達成しようとしました。リソースを変更するたびにプロジェクトを再構築することは問題外であり、これを解決したことは何もしていなかったので(これは一部の人にとっては新しいことだと思います)、(個人的なものであっても)それを並べさせてください参照 ;) )。要するに、これはEclipseのプロジェクトビルダーを使用します。

  1. Antスタイルのbuild.xmlを作成します

    <?xml version="1.0" encoding="UTF-8"?>
    <project>
        <property name="dir.resources" value="src/main/resources" />
        <property name="dir.target" value="bin/main" />
    
        <target name="native-to-ascii">
            <delete dir="${dir.target}" includes="**/*.properties" />
            <native2ascii src="${dir.resources}" dest="${dir.target}" includes="**/*.properties" />
        </target>
    </project>
    

    その目的は、ターゲットディレクトリ内のプロパティファイルを削除し、native2asciiそれらを再作成するために使用することです。native2ascii既存のファイルを上書きしないため、削除が必要です。

  2. Eclipseで、プロジェクトのプロパティに移動して[ビルダー]を選択し、[新規...]をクリックして、[Ant Builder]を選択します(これは、実行構成用に少し拡張されたエディターです)。
  3. 「メイン」で「Buildfile」がAntスクリプトを指すようにし、「BaseDirectory」を次のように設定します。${project_loc}
  4. [更新]で[完了時にリソースを更新]にチェックマークを付け、[選択したリソースを含むプロジェクト]を選択します
  5. [ターゲット]で、[自動ビルド]の横にある[ターゲットの設定]をクリックして選択native-to-asciiします(何らかの理由で、後でもう一度これを行う必要があることに注意してください)。
  6. これはすべての人にとって必要ではないかもしれませんが、「JRE」では適切な実行環境を選択してください
  7. [ビルドオプション]で[コンソールの割り当て]をオフにします(ただし、すべてが機能していることがわかるまで、これをオンのままにしておくことをお勧めします)
  8. 「適用」、「OK」
  9. 新しく作成されたビルダーはJavaビルダーの下のどこかにあるはずだと言われました(上/下ボタンを使用)
  10. 「Javaビルドパス」で、リソース(src/main/resources私にとって)を含むソースフォルダーを選択し、次の除外を追加します。**/*.properties

それはそれだったはずです。プロパティファイルを編集して保存すると、出力フォルダで自動的にASCIIに変換されます。を入力してみてください。üこれは、で終わるはず\u00fcです。

プロパティファイルがたくさんある場合は、時間がかかる場合があることに注意してください。キーを押すたびに保存しないでください。:)

于 2012-09-04T17:13:55.490 に答える