トップ «前の日記(Tue Dec 09 2003) 最新 次の日記(Fri Dec 12 2003)» 編集

よこいまさる日記



Thu Dec 11 2003 [長年日記]

[Linux] iconv の使い方...

 いやーっ、ハマったね、iconv。 たとえば下のようなことをやると、printf() での変数 outbuf は、変換後の文字列の先頭へのポインタとならない。

char *inbuf, *outbuf;
size_t inbufleft, outbufleft;
  .... 省略 ....
inbufleft = strlen(inbuf);
outbufleft = BUFSIZE;
outbuf = calloc(BUFSIZE, sizeof(char));
iconv(cd, &inbuf, &inbufleft, &outbuf, &outbufleft);
printf("%s\n", outbuf);

 上の場合、変換後の文字列の最後の部分 (文字 '\0')へのポインタとなっている。 outbuf に保持されるポインタの値を iconv() が書き換えている。 なので、以下のように書くと、期待していたとおりに動いてくれる。

char *in, *out, *inbuf, *outbuf;
size_t inbufleft, outbufleft;
  .... 省略 ....
inbuf = in;
inbuflen = strlen(inbuf);
outbuflen = BUFSIZE;
out = outbuf = calloc(BUFSIZE, sizeof(char));
iconv(cd, &inbuf, &inbufleft, &outbuf, &outbufleft);
printf("%s\n", out);
free(out);

 char* 型の変数 in, out に、それぞれの始点ポインタを保持させておくことが重要。 iconv() 実行後は out != outbuf な状態になる。 これに気づくのに数時間かけてしまった.... のである。

V801-SA

 会社で海外出張用に vodafone のV801-SAを一台新調していた。 ちと触らせてもらったんだけど、あのスライド式なところや、SDメモリカードを挿して MP3 が聞けたりするあたりが (・∀・)イイ!!。 しかも2万円程度で新規加入ができるんだそうで。 んで、GSM も使えるんだからねぇ。 明日あたりに、自宅でも利用できるか確認するために、会社から借りてみようっと。


2000|10|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|
あわせて読みたいブログパーツ