• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Javaで、画面入力したデータをファイルに書き出すプログラムを作成して)

Javaで画面入力したデータをファイルに書き出すプログラムと漢字コードの取り扱い

このQ&Aのポイント
  • Javaで画面入力したデータをファイルに書き出すプログラムを作成しています。漢字コードの取り扱いについて調査しています。
  • MS932では、ローマ数字等はNEC拡張文字とIBM拡張文字の領域に別々にコード番号があります。Javaプログラムでファイルに出力する際、NEC拡張文字とIBM拡張文字のどちらで出力されるのか気になります。
  • また、ファイルへの出力時にNEC拡張文字やIBM拡張文字を指定することは可能なのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Lieserl
  • ベストアンサー率81% (31/38)
回答No.2

質問1:実際にやってみた方が早いですよ。 少なくともUnicode(UTF-16)では無い。 って、やってみたらローマ数字の1は0x8754になりました。 質問2:できません。 指定できるのはcharset名です。全体です。 ピンポイントにNEC拡張漢字部分のみといった指定はできません。 ローマ数字に限って言えば、x-IBM942, x-IBM942C, x-IBM943あたりを指定すれば 0xFA4A~にマッピングされますが、ローマ数字以外の部分が、 期待した変換がなされるかどうなるかは調べてみないとわかりません。 1文字ずつチェックして、特別なマッピングが必要な文字であれば自前でバイト変換し、 そうではない部分は、getBytes("Windows-31J")するなりしてバイト変換し、 テキストではなくバイナリーで出力する方が良いと思います。 あるいは、getBytes("Windows-31J")したバイト配列をサーチして、 特別なマッピングが必要な部分だけ変換した後、 バイナリーで出力するか。

nittoyoo
質問者

お礼

回答ありがとうございました。 質問1はNEC拡張文字になるのですね。 やってみた方が早い、ごもっともでございます。お手数をおかけして申し訳ございません。 しかし、どこかの文献に記述されていると明確になっていいのですが、Google検索してもなかなか見つかりません。 質問2ですが、"Windows-31J"のエンコーディングではできないのですね。ほかのエンコーディングでできるのかの調査と、マッピングプログラムの自作の両面で検討してみます。 質問1と同様ですが、エンコーディング毎のマッピングはインターネット上で見つけることが難しいですね。(書籍としても日本語ではあるのか、ないのか。。。) とにかく、方向性が見えてきましたので大変助かりました。

nittoyoo
質問者

補足

さらに調査したところ、とても良いページを見つけました。 http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcode/93.html に私の疑問を解決する内容が書かれていました。 回答いただいた皆様大変ありがとうございました。

その他の回答 (1)

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

Javaはほとんど使っていないので、違っているかもしれません。 >>質問1:どちらでもなく、そのままUnicode(UTF-16)で出力される。 >>質問2:できない。もちろんコード変換処理を自分で記述すれば可能かも?でも、本質的に重複コードをもつUTF-16に変換されてしまっているので、識別できない。 以下は、「まつもとゆきひろコードの世界」のP.196,197からの引用です。 「Javaの制定時にUnicodeが16ビットにこだわっていたこと、Javaが可変長のUTF-8ではなくUTF-16を選んでしまったことが、このような「悲劇」を生んでしまいました。タイミングのいたずらと言えばそれまでですが大変残念です。」 (中略) 「PerlもUCS方式を採用しており、内部では文字符号化方式としてUTF-8を使っています。元から可変長のUTF-8を採用しているPerlでは、JavaにおけるUTF-16が引き起こしたような問題はありません。」 どうもJavaは漢字処理をきちんと行うには、十分な考慮が必要みたいです。Javaってやっかいな言語ですね。

nittoyoo
質問者

補足

回答ありがとうございます。 ファイル出力の場合、 OutputStreamWriterメソッドを使用すれば"Windows-31J"を指定することによりMS932コードでデータが出力されるようです。 http://www.viste.com/Java/Language/File.html の「SJIS漢字コードでのファイル書き込み」などの文書を参考にしています。 (なお、この参考文書では"SJIS漢字コード"を記述されていますが、"Windows-31J"を指定しているので正確には「MS932」漢字コードでの書き込みです。) 従いまして、UnicodeではなくMS932コードでの出力は可能なようです。 この様にしてMS932で出力した場合、質問1の疑問が発生したものです。 説明が足りなくて申し訳ございませんでした。

関連するQ&A