アプリ版:「スタンプのみでお礼する」機能のリリースについて

Javaで、画面入力したデータをファイルに書き出すプログラムを作成しています。
書き出したファイルを他のシステムへ渡す為、漢字コードの取り扱いについて調査しています。

MS932では、ローマ数字等はNEC拡張文字とIBM拡張文字の領域に別々にコード番号があります。
MS-IMEでWindows上でローマ数字を打つとNEC拡張文字で入力され、Javaのプログラムが入力を受け取ると内部で自動的にUnicodeへ変換されて、NEC拡張文字とIBM拡張文字区別無く同一のコードになります。

質問1:その後、Javaプログラムでファイルに"Windows-31J"指定で出力する場合、NEC拡張文字とIBM拡張文字のどちらで出力されるのでしょうか。

質問2:ファイルへ出力する時に、NEC拡張文字やIBM拡張文字を指定することはできるのでしょうか。

よろしくお願いいたします。

余談ですが、インターネット上には「NEC拡張文字」という言葉の他に、「NEC選定文字」や「NEC特殊文字」などの書き方があって同じものを指すのか別の物を指すのか、初心者としてはわかりにくく迷わされるところです。

A 回答 (2件)

質問1:実際にやってみた方が早いですよ。


少なくともUnicode(UTF-16)では無い。

って、やってみたらローマ数字の1は0x8754になりました。

質問2:できません。
指定できるのはcharset名です。全体です。
ピンポイントにNEC拡張漢字部分のみといった指定はできません。
ローマ数字に限って言えば、x-IBM942, x-IBM942C, x-IBM943あたりを指定すれば
0xFA4A~にマッピングされますが、ローマ数字以外の部分が、
期待した変換がなされるかどうなるかは調べてみないとわかりません。

1文字ずつチェックして、特別なマッピングが必要な文字であれば自前でバイト変換し、
そうではない部分は、getBytes("Windows-31J")するなりしてバイト変換し、
テキストではなくバイナリーで出力する方が良いと思います。

あるいは、getBytes("Windows-31J")したバイト配列をサーチして、
特別なマッピングが必要な部分だけ変換した後、
バイナリーで出力するか。

この回答への補足

さらに調査したところ、とても良いページを見つけました。
http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcod …
に私の疑問を解決する内容が書かれていました。

回答いただいた皆様大変ありがとうございました。

補足日時:2010/01/28 01:52
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

質問1はNEC拡張文字になるのですね。
やってみた方が早い、ごもっともでございます。お手数をおかけして申し訳ございません。
しかし、どこかの文献に記述されていると明確になっていいのですが、Google検索してもなかなか見つかりません。

質問2ですが、"Windows-31J"のエンコーディングではできないのですね。ほかのエンコーディングでできるのかの調査と、マッピングプログラムの自作の両面で検討してみます。

質問1と同様ですが、エンコーディング毎のマッピングはインターネット上で見つけることが難しいですね。(書籍としても日本語ではあるのか、ないのか。。。)

とにかく、方向性が見えてきましたので大変助かりました。

お礼日時:2010/01/28 01:25

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ってやっかいな言語ですね。

この回答への補足

回答ありがとうございます。

ファイル出力の場合、
OutputStreamWriterメソッドを使用すれば"Windows-31J"を指定することによりMS932コードでデータが出力されるようです。
http://www.viste.com/Java/Language/File.html
の「SJIS漢字コードでのファイル書き込み」などの文書を参考にしています。
(なお、この参考文書では"SJIS漢字コード"を記述されていますが、"Windows-31J"を指定しているので正確には「MS932」漢字コードでの書き込みです。)

従いまして、UnicodeではなくMS932コードでの出力は可能なようです。
この様にしてMS932で出力した場合、質問1の疑問が発生したものです。
説明が足りなくて申し訳ございませんでした。

補足日時:2010/01/28 01:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!