- PR -

機種依存文字コードのなぞ

1
投稿者投稿内容
takashi
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 79
お住まい・勤務地: 東京
投稿日時: 2008-08-22 19:49
いつも参考にさせていただいております。

表題の件で行き詰ってしまい、質問させていただきました。

このサイトを元に、機種依存文字チェックのメソッドを作成しております。
http://itpro.nikkeibp.co.jp/article/COLUMN/20061122/254626/

ここでは、878f(潤jの次は8790(≒)となっておりますが、

コード:
		
String target = "≒";
char[] buf = new String(target.getBytes("Windows-31J"), "8859_1").toCharArray();
int jis = Integer.parseInt((Integer.toHexString(buf[0]) + Integer.toHexString(buf[1])), 16);

System.out.println(jis);


とすると、”81e0”と表示されます。
ちなみに、盾ヘ想定どおり”878f”と表示されます。

コードの範囲で機種依存文字を弾こうと思ったのですが、これではどの範囲を弾けばよいか分かりません。

どなたか上記の理由が分かる方、ご教示いただけると幸いです。
よろしくお願いします。
satomi
会議室デビュー日: 2008/06/11
投稿数: 12
投稿日時: 2008-08-22 23:28
同じ活字に2つの文字コードが割り当てられているからです。

0x8790は、NEC特殊文字
0x81e0は、JIS X 0208

コードは違えど、文字としては同じなので、encodingにWindows-31Jを指定してStringに変換する際には、どちらも同じ\\u2252にマッピングされます。

encodingにShift_JISで変換した場合、0x8790は、\\ufffd(REPLACEMENT CHARACTOR)という変換できなかった文字を表すコードになるんじゃないかな?
(今、Javaのコンパイル環境が手元に無いので即答できません)

Unicodeとして入力された\\u2252なら、それはJIS X 0208の81e0なのですから、機種依存文字では無い。
バイト配列として入力された8790であれば、Stringに変換する前にチェックすれば良い。
という整理はできませんか?

FYI: WindowsAPIでの情報ですが、以下のように、他にもシフトJISとユニコードでマッチしない文字があります。
http://support.microsoft.com/default.aspx?scid=kb;ja;JP170559
takashi
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 79
お住まい・勤務地: 東京
投稿日時: 2008-08-24 17:36
>satomiさん

ご返信ありがとうございます。

なるほど、同じ文字に複数コードが割り当てられているのが原因だったんですね。
ということは、8790から879cまでのNEC特殊文字はJIS X 0208で表すことができるため、JIS X 0208のコードで受け取ったのであれば機種依存文字として弾く必要がないということになるんですね。

大変参考になりました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)