5

ファイル構造を実装するプログラムを作成すると、プログラムは構造に基づいて製品ファイルを出力します。製品名には、Æ、Ø、Å の文字が含まれます。これらの文字は、出力ファイルに正しく表示されません。私が使う

PrintWriter printer = new PrintWriter(new FileOutputStream(new File("products.txt")));

IS0 8859 - 1 または Windows ANSI (CP 1252) は、実装が必要とする文字セットです。

4

1 に答える 1

5

次の 2 つの可能性があります。

  • Java がファイルの出力時に間違ったエンコーディングを使用しています。
  • ファイルは実際には正しく、ファイルを表示するために使用しているものはすべて間違ったエンコーディングを使用しています。

問題が最初のものであると仮定すると、根本的な原因は、Java がプラットフォームのデフォルトのエンコーディングがあなたが望む/期待するものとは異なるものであることを発見したことです。これを解決するには、次の 3 つの方法があります。

  • Java のデフォルト ロケールとエンコーディングが「間違っている」理由を突き止め、それを修正します。それはあなたのオペレーティングシステムのロケール設定と関係があります...

  • コマンドラインでデフォルトのロケール設定をオーバーライドする方法の詳細については、この FAQをお読みください。

  • PrintWriterアプリケーションが既定のエンコーディングに依存しないように、エンコーディングを明示的に指定するコンストラクタを使用します。例えば:

    PrintWriter pw = new PrintWriter("filename", "ISO-8859-1");
    

このコメントに応えて:

すべての PrintWriter には、エラーが発生したことを認識できないというバグがありますか?

  • これはバグではなく、設計上の機能です。
  • エラーが発生したかどうかを確認できます。あなたはそれが何であったかを見つけることができません。
  • 気に入らない場合は、Writer代わりに使用できます。

指定されたエンコーディングに収まらないコードポイントをそれらに押し付けようとしても、例外は発生せず、失敗を返すことさえありません。

私が信じているレギュラーもそうではありませんWriter...これを行うために特別に構築しない限り。通常の動作では、マップできないコードポイントを特定の文字に置き換えますが、これは javadocs (IIRC) では指定されていません。

ファイルシステムがいっぱいになっているかどうかさえ教えてくれますか。そうではないことを覚えているようです。

それは本当です。でも:

  • 通常、 を使用して書き込む種類のファイルの場合、PrintWriterこれは重大な問題ではありません。

  • それが重大な問題であり、それでも を使用したい場合はPrintWriter、いつでもcheckError() (IIRC) を呼び出して、エラーが発生したかどうかを確認できます。

私は常に、明示的な Charset.forName("UTF-8").newEncoder() 2 番目の引数を使用して out OutputStreamWriter コンストラクターを作成することになります。ちょっと面倒なので、もっと良い方法があるかもしれません。

私は知らないよ。

于 2011-09-08T00:12:13.573 に答える