Javaで、画面入力したデータをファイルに書き出すプログラムを作成しています。
書き出したファイルを他のシステムへ渡す為、漢字コードの取り扱いについて調査しています。
MS932では、ローマ数字等はNEC拡張文字とIBM拡張文字の領域に別々にコード番号があります。
MS-IMEでWindows上でローマ数字を打つとNEC拡張文字で入力され、Javaのプログラムが入力を受け取ると内部で自動的にUnicodeへ変換されて、NEC拡張文字とIBM拡張文字区別無く同一のコードになります。
質問1:その後、Javaプログラムでファイルに"Windows-31J"指定で出力する場合、NEC拡張文字とIBM拡張文字のどちらで出力されるのでしょうか。
質問2:ファイルへ出力する時に、NEC拡張文字やIBM拡張文字を指定することはできるのでしょうか。
よろしくお願いいたします。
余談ですが、インターネット上には「NEC拡張文字」という言葉の他に、「NEC選定文字」や「NEC特殊文字」などの書き方があって同じものを指すのか別の物を指すのか、初心者としてはわかりにくく迷わされるところです。
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")したバイト配列をサーチして、
特別なマッピングが必要な部分だけ変換した後、
バイナリーで出力するか。
この回答への補足
さらに調査したところ、とても良いページを見つけました。
http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcod …
に私の疑問を解決する内容が書かれていました。
回答いただいた皆様大変ありがとうございました。
回答ありがとうございました。
質問1はNEC拡張文字になるのですね。
やってみた方が早い、ごもっともでございます。お手数をおかけして申し訳ございません。
しかし、どこかの文献に記述されていると明確になっていいのですが、Google検索してもなかなか見つかりません。
質問2ですが、"Windows-31J"のエンコーディングではできないのですね。ほかのエンコーディングでできるのかの調査と、マッピングプログラムの自作の両面で検討してみます。
質問1と同様ですが、エンコーディング毎のマッピングはインターネット上で見つけることが難しいですね。(書籍としても日本語ではあるのか、ないのか。。。)
とにかく、方向性が見えてきましたので大変助かりました。
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ってやっかいな言語ですね。
この回答への補足
回答ありがとうございます。
ファイル出力の場合、
OutputStreamWriterメソッドを使用すれば"Windows-31J"を指定することによりMS932コードでデータが出力されるようです。
http://www.viste.com/Java/Language/File.html
の「SJIS漢字コードでのファイル書き込み」などの文書を参考にしています。
(なお、この参考文書では"SJIS漢字コード"を記述されていますが、"Windows-31J"を指定しているので正確には「MS932」漢字コードでの書き込みです。)
従いまして、UnicodeではなくMS932コードでの出力は可能なようです。
この様にしてMS932で出力した場合、質問1の疑問が発生したものです。
説明が足りなくて申し訳ございませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) excelにて、特定の列に数字入力してあれば、入力してある行コピーして 別ファイルに張り付ける 2 2022/08/11 05:33
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- Java Java 南京錠 2 2023/02/04 11:46
- 画像編集・動画編集・音楽編集 文字等を拡大して印刷するときに生じるかもしれない問題について 3 2023/01/05 04:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
Path型をString型へ変換する(Java)
-
int型のゼロ埋め
-
JavaのStringクラスに「外字」...
-
グレイコードの変換
-
カタカナをローマジに変換する。
-
javascriptで文字列のsjis利用...
-
文字化けします。
-
UTF-8とUnicodeの互換性
-
javaの初歩的な質問です。
-
ダブルクォーテーションのrepla...
-
javaで入力したの半角カタカナ...
-
文字コード変換について
-
Visual Studio 6.0でビルド可能...
-
半角全角変換ロジックについて
-
phpでの文字コード変換について
-
VC++にてCString型のフルパスを...
-
文字コードを相互変換するには...
-
TEXTAREAからのデータを改行入...
-
replace関数で複数の文字の変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
Path型をString型へ変換する(Java)
-
カタカナをローマジに変換する。
-
int型のゼロ埋め
-
javascriptで文字列のsjis利用...
-
byte[] を long,float とかに...
-
C言語32bitから64bitの移行につ...
-
JavaのStringクラスに「外字」...
-
javaの初歩的な質問です。
-
Visual Basic でのコードをASCI...
-
UTF-8とUnicodeの互換性
-
文字列の比較
-
[Javascript]エンターキー押下...
-
下記問題の答えが"D"になる意味...
-
エクセルVBAで「〜」が表現でき...
-
byte配列をImageに変換する
-
javaで「全角が含まれているか...
-
IBM漢字コード⇒SJIS変換方法
-
Windows-31Jからutf-8への変換...
おすすめ情報