半角カナ文字から全角へ

半角カナが含まれた文章を全角カナに修正した文字列に変換する例です。文章が入力されたファイル(hankaku.txt)を例では用意していますが、ファイルはSJISで保存されていることに注意して下さい。また、プログラムもSJISでコンパイルしなければなりません。いずれかが、他の漢字コード(EUC or JIS)になっている場合は、正しく変換されません。

半角カナ文字から全角へ(list_62.c)
#include <stdio.h>

#define KANA "\
。「」、・ヲァィゥェォャュョッーアイウエオカキクケコ\
サシスセソタチツテトナニヌネノハヒフヘホマミムメモ\
ヤユヨラリルレロワン゛゜"

#define ISKANJI(c)       (((c)^0x20)-0xa1u< 60)
#define ISKANA(c)        ((c)-0xa1u < 63)
#define ISDAKU(c)        (((c)&0xff) == 0xde)
#define ISHANDAKU(c)     (((c)&0xff) == 0xdf)
#define MAYBEDAKU(c)     ((c)-0xb6u < 15 || (c)-0xcau < 5)
#define MAYBEHANDAKU(c)  ((c)-0xcau < 5)

//-----------------------------------------------------------------
void hk2zk(const char *han, char *zen);
//-----------------------------------------------------------------
int main(void)
{
    char buf[BUFSIZ], buf2[BUFSIZ];
    FILE* fp=fopen("hankaku.txt","r");
    while(fgets(buf,BUFSIZ,fp)) {
        hk2zk(buf,buf2);
        fputs(buf2,stdout);
    }
    fclose(fp);
    return 0;
}

//-----------------------------------------------------------------
// 半角カナ文字から全角へ
//-----------------------------------------------------------------
void hk2zk(const char *han, char *zen)
{
    unsigned char c;
    while(c=*han++){
        if(ISKANJI(c)) // 全角文字列
            *zen++ = c, *zen++ = *han++;
        else if(!ISKANA(c)) // 英数字[Roman,Ascii]
            *zen++ = c;
        else { // 半角カナ
            char* p = KANA + (c - 0xA1) * 2;
            *zen++ = p[0], *zen++ = p[1];
            if(MAYBEDAKU(c) && ISDAKU(*han)) // 濁音[ガetc]
                zen[-1]++, han++;
            if(MAYBEHANDAKU(c) && ISHANDAKU(*han)) // 半濁音[パetc]
                zen[-1]+=2, han++;
        }
    }
    *zen = 0;
}

半角カナ文字が含まれた文章(hankaku.txt)
日本語のテキスト中に「半角カナ」文字が含まれているテキストの例

半角文字列:

カナ:
アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ
マミムメモヤユヨラリルレロワヲンァィゥェォッャュョ。、・゛゜
濁音:
ガギグゲゴザジズゼゾダヂヅデドバビブベボ
半濁音:
パポプペポ

文章:
彼はニヤリと微笑むと、黒斑の眼鏡を持ち上げ不遜な表情を浮かべた。一体、こん
な奴のどこを信用しろと言うのであろうか?それでも、上司の命令は絶対であり
下手に逆らうことはできない。こんなヤ・ツ・でも、イ・チ・オ・ウ・は、上司なの
ダ・カ・ラ・。
と、そんな思考が頭に浮かび上がった瞬間、それが表情に出てしまった。長年の
付き合いで彼は私の思考も十分熟知しており、現在の思考もすでに読まれている
ようだ。今に思えばこの瞬間から、私の人生は大きく曲がり角を回り始めたので
ある。後々のことであるが、この一瞬の気の緩みこそが命取りであった、という
ことを身をもって知ることになる。

変換結果
日本語のテキスト中に「半角カナ」文字が含まれているテキストの例
 
半角文字列:

カナ:
アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ
マミムメモヤユヨラリルレロワヲンァィゥェォッャュョ。、・゛゜
濁音:
ガギグゲゴザジズゼゾダヂヅデドバビブベボ
半濁音:
パピプペポ

文章:
彼はニヤリと微笑むと、黒斑の眼鏡を持ち上げ不遜な表情を浮かべた。一体、こん
な奴のどこを信用しろと言うのであろうか?それでも、上司の命令は絶対であり
下手に逆らうことはできない。こんなヤ・ツ・でも、イ・チ・オ・ウ・は、上司なの
ダ・カ・ラ・。
と、そんな思考が頭に浮かび上がった瞬間、それが表情に出てしまった。長年の
付き合いで彼は私の思考も十分熟知しており、現在の思考もすでに読まれている
ようだ。今に思えばこの瞬間から、私の人生は大きく曲がり角を回り始めたので
ある。後々のことであるが、この一瞬の気の緩みこそが命取りであった、という
ことを身をもって知ることになる。
inserted by FC2 system