iconvにやられる
Cで日本語の文字コード変換を使ったプログラムを書いていたら、見事にハマってしまいました。
肝心の変換作業はiconvにおまかせだったのですが、iconvの引数にするためにずっとchar型で文字列を弄っていたら、UCS2に変換した後は半角文字でも全て2バイトにされるため、例えば0x61(Aだったかな?)が0x0061にされてしまい、char型だと途中に0x00が入ってstrlenが使えなくなったりで、無駄に悩みました。というわけでちゃんとワイド文字型使ったりunsigned shortもしくはunsigned int使った方がよさげ。でもUTF-8だったら可変なので一体どうしたらいいのか。nkfのソースでも読むか・・・。
以下はiconvのサンプルコード(EUC-JP前提)。前後で上記のようなハマりかたをしないように気をつける。それにしてもなんでこの関数はこんな変な使い方なのか・・・。
iconv_t cd; char src[256] = "あかさたなはまやらわ"; char dst[256]; char *s = src; char *d = dst; int slen = strlen(src); int dlen = sizeof(dst) - 1; cd = iconv_open("UTF-8", "EUC-JP"); iconv(cd, &s, &slen, &d, &dlen); iconv_close(cd);
注意点としては、
- iconv_openの引数の順番(変換後、変換前 の順)
- UCS2に変換する場合は単純にprintfしても切れてしまうことあり。(EUCやUTFは大丈夫ぽい)
- #include
を忘れずに