[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:13806] Re: iconv()



At Mon, 26 Feb 2001 23:25:27 +0900,
Tatsuki Sugiura wrote:

> >>> In Message "[debian-devel:13802] iconv()"
> >>>            <LKEGINGPONHKOGEAMGDIEEALCAAA.yori_h@xxxxxxxxx>
> >>> "HATTORI Yoriyosi" <yori_h@xxxxxxxxx>  said;
> > debパッケージの日本語化に挑戦していますが、iconv()の使用法が、いまひ
> > とつわからずにおります。
> > iconv()で、SJIS -> EUC 変換のコーティング例(sourceでも結構です)など紹介し
> > てもらえないでしょうか。
> 
> 私も知りたくて探したのですが、
> http://www.kondara.org/~t/linux/redhat-54.html
> で一つ見つけました。ただ、古いので、結局
> /usr/share/doc/glibc-doc/html/chapters_6.html (の#SEC101)
> を読んで少し修正する必要がありましたが。
> # といってもまだ全然理解できていない。駄目だ……
> 
> 他にどこか良い解説ご存じの方いらっしゃいません?

うーむ glibc.info でわからないとなるとまずはこれくらいから?
エラー処理とか境界条件あたりはなにもしてませんが…

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

int
main(int argc, char *argv[])
{
    char inbuf[BUFSIZ];
    char outbuf[BUFSIZ];
    iconv_t cd;
    size_t nconv;
    char *inptr, *outptr;
    int insiz, outsiz;

    cd = iconv_open("EUC-JP", "SHIFT-JIS"); /* SJIS -> EUC-JP */
    if (cd == (iconv_t)-1) {
	perror("iconv_open");
	exit(1);
    }
    while (fgets(inbuf, sizeof(inbuf), stdin) != NULL) {
	inptr = inbuf;
	insiz = strlen(inbuf);
	outptr = outbuf;
	outsiz = sizeof(outbuf);
	nconv = iconv(cd, &inptr, &insiz, &outptr, &outsiz);
	/*
	 * inptr,insiz,outptr,outsiz は処理した分だけ移動/変化する。
	 * inbuf から inptr までがSHIFT-JISからEUC-JPに変換されて
         * outbuf から outptr に設定される。
	 * nconv == -1 の時はエラーなのでそれなりに処理。
	 * errno でエラーの原因はわかる。詳しくはinfo参照
	 */
	*outptr = '\0';
	printf("%s", outbuf);
    }
    iconv_close(cd);
    exit(0);
}

-- 
鵜飼文敏