次の 2 つの可能性があります。
- Java がファイルの出力時に間違ったエンコーディングを使用しています。
- ファイルは実際には正しく、ファイルを表示するために使用しているものはすべて間違ったエンコーディングを使用しています。
問題が最初のものであると仮定すると、根本的な原因は、Java がプラットフォームのデフォルトのエンコーディングがあなたが望む/期待するものとは異なるものであることを発見したことです。これを解決するには、次の 3 つの方法があります。
Java のデフォルト ロケールとエンコーディングが「間違っている」理由を突き止め、それを修正します。それはあなたのオペレーティングシステムのロケール設定と関係があります...
コマンドラインでデフォルトのロケール設定をオーバーライドする方法の詳細については、この FAQをお読みください。
PrintWriter
アプリケーションが既定のエンコーディングに依存しないように、エンコーディングを明示的に指定するコンストラクタを使用します。例えば:
PrintWriter pw = new PrintWriter("filename", "ISO-8859-1");
このコメントに応えて:
すべての PrintWriter には、エラーが発生したことを認識できないというバグがありますか?
- これはバグではなく、設計上の機能です。
- エラーが発生したかどうかを確認できます。あなたはそれが何であったかを見つけることができません。
- 気に入らない場合は、
Writer
代わりに使用できます。
指定されたエンコーディングに収まらないコードポイントをそれらに押し付けようとしても、例外は発生せず、失敗を返すことさえありません。
私が信じているレギュラーもそうではありませんWriter
...これを行うために特別に構築しない限り。通常の動作では、マップできないコードポイントを特定の文字に置き換えますが、これは javadocs (IIRC) では指定されていません。
ファイルシステムがいっぱいになっているかどうかさえ教えてくれますか。そうではないことを覚えているようです。
それは本当です。でも:
私は常に、明示的な Charset.forName("UTF-8").newEncoder() 2 番目の引数を使用して out OutputStreamWriter コンストラクターを作成することになります。ちょっと面倒なので、もっと良い方法があるかもしれません。
私は知らないよ。