3

プロパティ ファイル + ResourceBundle を使用して異なる文字列を取得する Hello World プログラムを作成することで、国際化を実験しています。

具体的には、「hello.world=Hello World!」を保存する「messages_en_US.properties」というファイルがありますが、もちろん問題なく動作します。

次に、あらゆる種類のことを試した「messages_ja_JP.properties」ファイルがありますが、コンソールまたはSwingに出力すると、常にある種の文字化けした文字列として表示されます。ソースに直接入力された日本語の Java 文字列は正常に出力されるため、明らかに問題は Java 文字列へのコンテンツの読み取りにあります。

私が試したこと:

  • 日本語文字列を値としてそのまま使用した UTF-8 エンコーディングの .properties ファイル。私が読んだものは、Javaがプロパティファイルがシステムのネイティブエンコーディングであることを期待していることを示しています...? どちらの方法でも機能しませんでした。
  • デフォルトのエンコーディング (ISO-8859-1) のファイルと、Java に含まれる native2ascii プログラムによって作成されたエスケープされた Unicode として格納された値。SHIFT-JIS、EUC-JP、ISO-2022-JPなど、さまざまな日本語エンコーディングのソースファイルで試してみました。

編集:

これを入力しているときに実際にこれを理解しましたが、とにかく投稿して、誰かの助けになる場合に備えて回答すると思いました。

4

3 に答える 3

3

私は、native2ascii が、オペレーティング システムのデフォルトのエンコーディングから毎回変換していると (驚き) 想定していて、正しいエスケープ Unicode 文字列を生成していないことに気付きました。

「-encoding encoding_name」オプションを指定して native2ascii を実行すると、 encoding_nameはソース ファイルのエンコーディングの名前 (この場合は SHIFT-JIS) であり、正しい結果が生成され、すべて正常に動作しました。

Antには、一連の入力ファイルでnative2asciiを実行し、必要な場所に出力ファイルを送信するnative2asciiタスクもあります。そのため、Eclipseでそれを行うビルダーを追加して、ソースフォルダーに元のエンコーディングの文字列を簡単に含めることができました編集およびビルドにより、変換された同じ名前のファイルが出力フォルダーに自動的に配置されます。

于 2008-10-11T18:44:01.460 に答える
2

JDK 1.6以降、PropertiesにはReaderを受け入れるload()メソッドがあります。つまり、すべてのプロパティファイルをUTF-8として保存し、InputStreamReaderをload()に渡すことで、それらすべてを直接読み取ることができます。これが最も洗練されたソリューションだと思いますが、アプリをJava6ランタイムで実行する必要があります。

歴史的に、load()はInputStreamのみを受け入れ、ストリームはISO-8859-1としてデコードされていました。 システムのデフォルトのエンコーディングではなく、常にISO-8859-1です。それは特定のハックを可能にするので、それは重要です。プロパティファイルがUTF-8として保存されているとします。プロパティを取得したら、次のように、ISO-8859-1として再エンコードし、UTF-8として再度デコードできます。

String realProp = new String(prop.getBytes("ISO-8859-1"), "UTF-8");

それは醜くて壊れやすいですが、それは機能します。しかし、少なくとも今後数年間は、Antなどのビルドツールを使用してnative2asciiでファイルを一括変換するのが最善の解決策だと思います。

于 2008-10-11T23:07:08.747 に答える
0

プロパティ ファイルを処理する別の方法: http://www.unipad.org/main/

これは、\u Unicode エスケープ形式でファイルを読み書きできるエディターです。これは、native2ascii が作成する形式です。

日本語でうまく機能するかわかりませんが、ハンガリー語で使用しました。

于 2008-10-11T20:40:28.307 に答える