半角カナを全角カナに変換する(濁音対応版)


関数名
han2zen  半角カナを全角カナに変換する(濁音対応版)
形式
int han2zen(unsigned int *zenkaku, unsigned char *str);
引数
zenkaku  (出力)全角カナJISコード
str      (入力)半角カナコード(0xA0-0xDF)を含めた文字列
関数値
変換結果についての付加情報
・引数strの先頭文字が半角カナでない場合、関数値は0
・引数strの先頭文字が半角清音カナである(つまり先頭の
 2文字が濁音・半濁音カナの組合せでない)場合、関数値は1
・引数strの先頭2文字が濁音・半濁音カナの組合せである場合、
 関数値は2
注意事項
濁音・半濁音の場合は2文字分の半角カナが1文字分の全角カナに 変換される

用例(han2zen-test.c
unsigned int zenkaku;
han2zen(&zenkaku, "\xc0\xde");

プログラム(han2zen.c
int han2zen(unsigned int *zenkaku, unsigned char *str)
{
    static unsigned int z[64] = {
        0x2121,0x2123,0x2156,0x2157,0x2122,0x2126,0x2572,0x2521,
        0x2523,0x2525,0x2527,0x2529,0x2563,0x2565,0x2567,0x2543,
        0x213c,0x2522,0x2524,0x2526,0x2528,0x252a,0x252b,0x252d,
        0x252f,0x2531,0x2533,0x2535,0x2537,0x2539,0x253b,0x253d,
        0x253f,0x2541,0x2544,0x2546,0x2548,0x254a,0x254b,0x254c,
        0x254d,0x254e,0x254f,0x2552,0x2555,0x2558,0x255b,0x255e,
        0x255f,0x2560,0x2561,0x2562,0x2564,0x2566,0x2568,0x2569,
        0x256a,0x256b,0x256c,0x256d,0x256f,0x2573,0x212b,0x212c};
    typedef struct {
        unsigned char han;
        unsigned int zen;
    } TBL;
    static TBL daku[] = {
        {0xb3,0x2574},{0xb6,0x252c},{0xb7,0x252e},{0xb8,0x2530},
        {0xb9,0x2532},{0xba,0x2534},{0xbb,0x2536},{0xbc,0x2538},
        {0xbd,0x253a},{0xbe,0x253c},{0xbf,0x253e},{0xc0,0x2540},
        {0xc1,0x2542},{0xc2,0x2545},{0xc3,0x2547},{0xc4,0x2549},
        {0xca,0x2550},{0xcb,0x2553},{0xcc,0x2556},{0xcd,0x2559},
        {0xce,0x255c},{0,0}};
    static TBL handaku[] = {
        {0xca,0x2551},{0xcb,0x2554},{0xcc,0x2557},{0xcd,0x255a},
        {0xce,0x255d},{0,0}};
    int i;

    if (*str < 0xa0 || *str > 0xdf) return 0;
    if (*(str+1) == 0xde) {           /* 濁音符 */
        for (i = 0; daku[i].zen != 0; i++)
            if (*str == daku[i].han) {
                *zenkaku = daku[i].zen;
                return 2;
            }
    } else if (*(str+1) == 0xdf) {    /* 半濁音符 */
        for (i = 0; handaku[i].zen != 0; i++)
            if (*str == handaku[i].han) {
                *zenkaku = handaku[i].zen;
                return 2;
            }
    }
    
    *zenkaku = z[*str - 0xa0];
    return 1;
}
説明
半角カナは使わないことにしよう。このことから、全角カナを 半角カナに戻す関数を用意するつもりはない。どうしても必要な方は 自作して下さい。

関連関数
半角カナを全角カナに変換する (濁音非対応版)