- ベストアンサー
漢字の第1バイト検証
今、文字判定関数について勉強しているのですが、 unsingned char uch にgetchar()の値を入れ if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xfc) とうコードで、なぜ漢字コードは「0x81~0x9f」と「0xe0~0xfc」の 二つの範囲があるのか解りません。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
厳密にはそのプログラムは誤りで、 if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xef) が正解です。 で、どうして領域が2つに分かれてるかというと、端的にいうと、しょうがなかったからです。 MrSIMPSOM さんが今取得しようとしているのは、シフトJIS形式と呼ばれる文字形式です。 この形式は、半角文字と全角文字を1つの文字列の中に混在させるための手段として、「特定のコードであれば、あとに続く1バイトとの合計2バイトで漢字を表す」としています。 ところが、「では実際にどのコードが来たら漢字ということにするか」ということになった際に、当時まだ使われてなかった領域が、その範囲しかなかったわけです。 当時のコンピュータの性能からして、半角カタカナの領域を潰すわけにはいかなかったからです。 なので、しょうがなく漢字を表す領域は2つに分けられることになってしまったのです。
その他の回答 (1)
えーと。再登場。 2バイト目についてですが、よく分かりません(^_^; 少なくとも、コントロールコードを回避して配置されたことは確かだと思いますが……。
お礼
そうですか...私もコントロールコードは 回避する必要があったとは思いましたが、 別に0x30でもいいじゃん(笑)と疑問に思い補足してみました。 いつのまにかにプログラミングの質問から離れていった質問に 答えてくれてdeagleさんありがとう御座いました。
お礼
コードミスしてしまうとは、お恥ずかしい(笑) なるほど、しょうがなく分けられたんですか。 ありがとうございました。
補足
補足と言うわけではないのですが、文字コードの2バイト目は、 0x40で始まるじゃないですか、単に0x40は@を表しますよね。 そこで、なんで2バイト目はそこから始まるようになったのですか。 度々すみませんがお願いします。