C言語ケーススタディ 全角文字の処理方法




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



全角文字と半角文字の識別


 全角文字は2バイトで1文字となります(Windowsで主に使用されているシフトJISコードについて解説します)。 全角文字の1バイト目は半角文字と区別することができますが、2バイト目は区別することができません。 そのため、全角文字と半角文字が混在している文字列では、全角文字と半角文字を区別することが重要です。 全角文字の1バイト目を区別するには_ismbblead()関数を使用します。 この関数に1バイト目の文字を渡すと、真か偽かを返します。 真の場合は全角文字の1バイト目になります。 全角/半角文字が混在した文字列では、先頭から調べていかないと全角文字と半角文字を区別することができません。 次のプログラムは、_ismbblead()関数を使用して与えられた文字列を先頭からチェックして全角文字を[]で囲んで表示するようにしたものです。
main()
{
        char    *str = "123498765abcd漢字0000";
        int     i1;

        for(i1 =0;;){
                if(str[i1] == '\0')
                        break;
                if(_ismbblead(str[i1])){
                        if(str[i1+1] == '\0'){
                                break;
                        }
                        putchar('[');
                        putchar(str[i1++]);
                        putchar(str[i1++]);
                        putchar(']');
                        continue;
                }
                putchar(str[i1++]);
        }
}
[1][2][3][4][9][8][7][6][5]abcd[漢][字][0][0][0][0]
 最初の2個のputchar()関数が全角文字を表示している部分です。 また、3個目のputchar()関数は半角文字を表示しています。

全角/半角混在文字の文字数


 前のプログラムを利用して全角/半角混在文字の文字数を数えるプログラムを作成します。 strlen()関数では、文字列のバイト数をカウントしてしまうので全角文字は1文字でも2文字としてカウントされてしまいます。
main()
{
        char    *str = "123498765abcd漢字0000";
        int     i1, len;

        for(i1 = len = 0;;){
                if(str[i1] == '\0')
                        break;
                if(_ismbblead(str[i1])){
                        if(str[i1+1] == '\0'){
                                break;
                        }
                        len++;
                        i1 += 2;
                        continue;
                }
                len++;
                i1++;
        }
        printf("strlen = %d\n", strlen(str));
        printf("len = %d\n", len);
}
strlen = 34
len = 19

【参照関数】
_ismbblead
_ismbbtrail
_ismbbkana

【関連項目】
C言語ケーススタディ 全角/半角混じり文字列の文字数
C言語ケーススタディ 全角/半角混じり文字列内の文字検索