にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

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 を忘れずに