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