掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26092

半角カナを全角カナに変換しているコードについて
投稿者---べた(2006/02/12 20:53:15)


過去ログにあったのですが、下の処理について教えて下さい。

デファイン定義している KANA の定義についてなのですが、
「\" 」というところがあるのですが、何の文字を表しているのですか。

char *p = KANA + (c - 0xA1) * 2 ;
*zen++ = p[0], *zen++ = p[1] ;
で、デファインしているkNAKから半角カナがどうして全角カナに変換されるのですか。

if (MAYBEDAKU(c) && ISDAKU(*han))
zen[-1]++, han++ ;
else if (MAYBEHANDAKU(c) && ISHANDAKU(*han))
zen[-1] += 2, han++ ;
一度、全角にした文字を再度チェックしているのは。

#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)
{
    unsigned char c ;

    while (c = *han++)
        if (ISKANJI(c))
            *zen++ = c, *zen++ = *han++ ;
        else if (!ISKANA(c))
            *zen++ = c ;
        else {
            char *p = KANA + (c - 0xA1) * 2 ;
            *zen++ = p[0], *zen++ = p[1] ;
            if (MAYBEDAKU(c) && ISDAKU(*han))
                zen[-1]++, han++ ;
            else if (MAYBEHANDAKU(c) && ISHANDAKU(*han))
                zen[-1] += 2, han++ ;
        }
    *zen = 0 ;
}







この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:半角カナを全角カナに変換しているコードについて 26094 RAPT 2006/02/12 22:18:21


No.26094

Re:半角カナを全角カナに変換しているコードについて
投稿者---RAPT(2006/02/12 22:18:21)


> #define KANA \
>   "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソ\" \
>   "タチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜"
ここだけ。
ShiftJISコードの場合、「ソ」の2バイト目はバックスラッシュ(\)なので、
文字化けの元となることがあります。その場合、バックスラッシュを補う
ことで、文字化けを防ぎます。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧