作者: Bruce.
日時: 2008/12/27(03:28)
Bruce.です。

davi さんは書きました (2008/12/26 22:29):
>> 		if (iskanji(c)) {
>> 			if (iskanji2(c2 = fgetc(fp)))
>> 				c = ((c << 8) | c2);//←2バイト文字なら上位下位のペアを組み立てる
> 
> この8って何じゃ?、と思っていたら、SJISの2バイト文字が8140〜だから、
> 読み込んだ1バイト(8ビット)分の、先頭が8以下なら半角(ASCIIだけでなく
> 半角カナも含む)、という判断にする根拠に使っていたんですね。

先頭が8以下ってはどこから湧いて出たんですか?
81 と 40 から 8140 を組み立てるには、81*16 + 40 を行えばよいわけで、
掛け算の部分は左へ8ビットシフトするのに置き換えることが可能で、
また足し算部分も0のところに加算するので bitwise or に置き換えられる。
ということで
(c << 8) | c2
となっているだけの話ですが。

前回のメールに書いたように、このプログラムではいわゆる半角文字は
上位バイトが 00 になりますから、0xff を越える値かどうかで
判定しています。


>> 004C 0043 0053 02F0 0E67 02A4
>>
>> という16ビットごとの並びにして、処理を進めているわけです。
> 
> ある意味、独自に内部コード化してる、ということですか?

そうです。

> すると、拭(SJISで9040)、漾(SJISでE040)なんかは、
> それぞれ1040、7040となるわけですか?

90 → 1001_0000
E0 → 1110_0000

ですので、そこから最上位ビットを落とすと 10 と 60ですね。
-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?
  mail kbk [at] kt.rim.or.jp
        web  www.kt.rim.or.jp/~kbk/zakkicho/
             homepage3.nifty.com/farstar/