|
> S−JISの半角カナを全角カナに変換する関数を作りたいのですが、
> 何かよい方法はないでしょうか?
よい方法は、文字コードをよく調べることです。
#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)
{
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;
}
int main(void)
{
char buf[256], buf2[512];
while (fgets(buf, sizeof buf, stdin)) {
hk2zk(buf, buf2);
fputs(buf2, stdout);
}
return 0;
}
|