ログ日記

作業ログと日記とメモ

libiconvで文字コード変換

C言語でのiconvの使い方が分からない。

#include <iconv.h>

size_t iconv(iconv_t cd,
             char **inbuf, size_t *inbytesleft,
             char **outbuf, size_t *outbytesleft);
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/iconv.3.html

このインターフェースは何なんだ?と思って使い方を検索しても、どうもしっくり来ない。
ブログに書かれているサンプルコードが間違っている気がしてならない。


ふとWikipediaを見てみると、一番まともに見えるコードが書いてあった。

#include <stdio.h>
#include <iconv.h>

#define S_SIZE (1024)

int main(){
  iconv_t icd;
  FILE *fp_src, *fp_dst;
  char s_src[S_SIZE], s_dst[S_SIZE];
  char *p_src, *p_dst;
  size_t n_src, n_dst;

  icd = iconv_open("UTF-8", "Shift_JIS");
  fp_src = fopen("sjis.txt", "r");
  fp_dst = fopen("utf8.txt", "w");

  while(true){
    fgets(s_src, S_SIZE, fp_src);
    if (feof(fp_src))
      break;
    p_src = s_src;
    p_dst = s_dst;
    n_src = strlen(s_src);
    n_dst = S_SIZE-1;
    while(0 < n_src){
      iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
    }
    *p_dst = '\0';
    fputs(s_dst, fp_dst);
  }

  fclose(fp_dst);
  fclose(fp_src);
  iconv_close(icd);

  return 0;
}
http://ja.wikipedia.org/wiki/Iconv

この引数の分かりにくさ。
絶対誰か書いていると思ってそういう方向で探したら
http://cpplover.blogspot.jp/2012/04/iconv.html
書いてた。


何か自分が理解していないセオリーがあってこういう引数になっている、というわけでもなさそうなので安心した。