
今、客先のデータをJavaで処理しようとしているのですが、そのデータ(Shift-JISの文字列データ)には、今まで使われてきた「外字」が含まれています。
私の知っている範囲では、Shift-JISの文字列でも、Javaで読み込んだら内部的にUnicodeに変換されるのではないかと思っているのですが(←間違っているかもしれません)、そのUnicode変換の際に外字の部分はどうなってしまうのでしょうか。また、Unicodeに変換された文字列を、出力の際にまたShift-JISに戻すことになると思うのですが、そのときにはちゃんと以前の外字コードに戻ってくれることが保証されているのでしょうか。
JavaのリファレンスでStringクラスのページで「外字」という文字列で検索してみたのですが、まったくひっかからなかったので不安になっています。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
#1です。
似たような質問があがっているところを見つけました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
ということで、これを参考に実験です。
UTF-16の外字の領域を一文字ずつShift-JISに変換して、また、UTF-16に戻して、ちゃんともとにもどるか、やってみました。
public class Gaiji {
public static void main(String[] args) throws Exception {
final String charSet = "Shift-JIS";
boolean allEqual = true;
for (char c = 0xE000; c <= 0xF8FF; c++) {
System.out.print(Integer.toHexString((int)c) + "→");
char[] carray = {c};
String source = new String(carray);
byte[] sjis = source.getBytes(charSet);
for (byte b : sjis)
System.out.print(Integer.toHexString(((int)b & 0xFF)));
System.out.print("→");
String result = new String(sjis, charSet);
System.out.print(Integer.toHexString((int)result.charAt(0)) + " : ");
boolean equal = source.equals(result);
System.out.println(equal);
allEqual = (allEqual && equal);
}
System.out.println();
System.out.println("すべて一致 : " + Boolean.toString(allEqual));
}
}
(コンパイルするときは全角スペースを半角スペースに変換してからにしてください)
ところがぜんぜんダメ。
元に戻りません。
ということで、Windowsの本来の文字コードWindows-31Jでやってみました。
final String charSet = "Windows-31J"; ←変更
どうやらうまく行っているのですが、途中までは順調に変換され、元に戻るものの、途中からだめになりました。
どうやら、UTF-16 : E757 Shift-JIS : F9FC の次からだめになっています。
外字エディタで見てみるとちょうどF9FCまでが、Shift-JISの外字領域のようです。
つまり、UTF-16のほうがShift-JISより、外字領域が大きいみたいです。
当然そこから先は、Shift-JISには、変換不能ということになります。
というわけで、
1.Windowsでは、通常ならCharSetがShift-JISでも大体大丈夫だけど、外字の変換をするときにはちゃんとWindows-31Jを指定しないとダメ。
2.UTF-16 : E000~E757 Shift-JIS : F040~F9FC の範囲なら変換可能。
UTF-16 : E758~F8FF の範囲はShift-JISに相手がいないので無理。
ってことで、Shift-JISで外字が設定されているのなら、大丈夫ってことになるんじゃないでしょうか。
参考URL:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
No.1
- 回答日時:
こんばんは、興味があったので実験してみました。
(環境 WindowsXP SP2 : JDK 1.5.0_04)
外字エディタにて シフトJISで F040 Unicodeで E000 に外字を作成。(手書きのふにゃふにゃ温泉マーク)
char[] c = {0xE000};
String s = new String(c);
System.out.println(s);
これで、ちゃんと外字が出てきました。
次に、メモ帳にて外字の温泉マークが書いてあるテキストをシフトJISで保存。
BufferedReader br = new BufferedReader(new FileReader("gaiji.txt"));
for (String line; (line = br.readLine()) != null;) {
System.out.println(line);
}
やっぱり、普通に温泉マークが出てきました。
今度は、外字エディタで作った温泉マークを削除。
さっきのコードを実行すると、温泉マークが出てこず、空白になります。
早い話が、char型変数やStringクラスが扱っているのは文字コードという純然たる数字であって、実際にフォントとして描くのはシステムに依存しているって事なんじゃないでしょうか。
つまり、結局のところ、OSでその文字コードに外字が割り当ててあれば、ちゃんと表示され、されていなければ、それなりになるって事だと思います。
この回答への補足
ありがとうございます。
これは
・Shift-JISでは外字領域はF040以降(←これは知ってました)
・UnicodeではE000以降
・それらは1対1で対応している
・たとえばF040<->E000、F041<->E001、というように
・これをやってくれるのは、Javaの仕様
っていうことなんでしょうか。
Unicodeに直した後は、画面には表示する予定はないので、フォントの割り当てなどは気にならないのですが、Shift-JIS変換の際に相互の可逆性があるかどうかが気になっているのです。
ご存じでしたら教えてください。お願いします。<(_ _)>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptで文字列のsjis利用...
-
JavaのStringクラスに「外字」...
-
「C#」文字コードの取得&文字変換
-
javaで質問です。 文字列2023/2...
-
C言語32bitから64bitの移行につ...
-
文字列の比較
-
Visual Basic でのコードをASCI...
-
int型のゼロ埋め
-
全角英数字とハイフンを半角に...
-
シフトJISのエンコード
-
数字を読みに変換する方法について
-
文字化け対策について
-
あるディレクトリにある複数の...
-
byte型のマイナスの扱いについて
-
JAVAソースコードの暗号化
-
どんな時にIteratorを使うと便...
-
javaの日本語並び替えについて...
-
greasemonkeyのスプリクトの222...
-
TEXTAREAからのデータを改行入...
-
ダブルクォーテーションのrepla...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javaで質問です。 文字列2023/2...
-
javascriptで文字列のsjis利用...
-
Path型をString型へ変換する(Java)
-
カタカナをローマジに変換する。
-
Visual Basic でのコードをASCI...
-
JavaのStringクラスに「外字」...
-
エクセルVBAで「〜」が表現でき...
-
Windows-31Jからutf-8への変換...
-
C言語32bitから64bitの移行につ...
-
文字列の比較
-
int型のゼロ埋め
-
javaの初歩的な質問です。
-
byte型のマイナスの扱いについて
-
substring バイト単位でやりたい
-
JAVAでのShift-JISとEUC-JP間の...
-
byte配列をImageに変換する
-
byte[] を long,float とかに...
-
UTF-8とUnicodeの互換性
-
COBOLで半角カナを全角カナに変換
おすすめ情報