• ベストアンサー

漢字の第1バイト検証

今、文字判定関数について勉強しているのですが、 unsingned char uch にgetchar()の値を入れ if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xfc) とうコードで、なぜ漢字コードは「0x81~0x9f」と「0xe0~0xfc」の 二つの範囲があるのか解りません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 厳密にはそのプログラムは誤りで、 if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xef)  が正解です。  で、どうして領域が2つに分かれてるかというと、端的にいうと、しょうがなかったからです。  MrSIMPSOM さんが今取得しようとしているのは、シフトJIS形式と呼ばれる文字形式です。  この形式は、半角文字と全角文字を1つの文字列の中に混在させるための手段として、「特定のコードであれば、あとに続く1バイトとの合計2バイトで漢字を表す」としています。  ところが、「では実際にどのコードが来たら漢字ということにするか」ということになった際に、当時まだ使われてなかった領域が、その範囲しかなかったわけです。  当時のコンピュータの性能からして、半角カタカナの領域を潰すわけにはいかなかったからです。  なので、しょうがなく漢字を表す領域は2つに分けられることになってしまったのです。

MrSIMPSOM
質問者

お礼

コードミスしてしまうとは、お恥ずかしい(笑) なるほど、しょうがなく分けられたんですか。 ありがとうございました。

MrSIMPSOM
質問者

補足

補足と言うわけではないのですが、文字コードの2バイト目は、 0x40で始まるじゃないですか、単に0x40は@を表しますよね。 そこで、なんで2バイト目はそこから始まるようになったのですか。 度々すみませんがお願いします。

その他の回答 (1)

noname#25358
noname#25358
回答No.2

 えーと。再登場。  2バイト目についてですが、よく分かりません(^_^;  少なくとも、コントロールコードを回避して配置されたことは確かだと思いますが……。

MrSIMPSOM
質問者

お礼

そうですか...私もコントロールコードは 回避する必要があったとは思いましたが、 別に0x30でもいいじゃん(笑)と疑問に思い補足してみました。 いつのまにかにプログラミングの質問から離れていった質問に 答えてくれてdeagleさんありがとう御座いました。