Namazu-devel-ja(旧)


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

Re: Why EUCJP?



Ryuji Abe <raeva@xxxxxxxxxxxx> wrote:

>kakasi/chasenモジュールを使う場合にsgmt_codeset()
>は"EUCJP"を返しますけど、"EUC-JP"でなく"EUCJP"と
>しているのは何か理由があるのでしょうか?

iconv(3) が "EUCJP" の方を好むから…、という理由だった気がし
ますが、今、試したら glibc 2.1.2 の iconv(3) では "EUC-JP" 
でも受け付けますね。

他の環境でも試しました:

OSF1 V4.0: (たぶん True 64 UNIX)

  % echo '漢字' | ./iconv-test EUC-JP EUC-JP
  iconv_open: Invalid argument

  % echo '漢字' | ./iconv-test EUCJP EUCJP
  iconv_open: Invalid argument

  % echo '漢字' | ./iconv-test eucJP eucJP
  漢字

EUCJP, EUC-JP は駄目で eucJP は OK ですね。うむむ。テストに
使ったプログラムを末尾に添付します。

他にも Solaris 2.5.1, Soralis 7, IRIX 6.5 の環境があるのです
が、明日の停電に備えて電源が切られています。月曜日にでも試し
ます。

現状では iconv(3) を利用できない環境が多そうなので、文字コー
ドの変換処理は別の方法でも行えるようにしないといけませんね。

# liblv がそのうち登場するという噂を聞いたような

--
高林 哲 (Takabayashi, Satoru)
http://cl.aist-nara.ac.jp/~satoru-t/

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <iconv.h>
#include <errno.h>

int 
main (int argc, char **argv)
{
    size_t outbufsize = BUFSIZ;
    char *inbuf, *outbuf;
    iconv_t cd;  /* stands for conversion descriptor */
    char *incode, *outcode;

    if (argc != 3) {
	printf("Usage: iconv-test <incode> <outcode>\n");
	exit(1);
    }
    incode  = argv[1];
    outcode = argv[2];

    cd = iconv_open(outcode, incode);
    if (cd == (iconv_t)-1) {
	perror("iconv_open");
    }

    inbuf = malloc(BUFSIZ);   
    outbuf = malloc(outbufsize);  

    while (fgets(inbuf, BUFSIZ, stdin) != NULL) {
	int len = strlen(inbuf);
	const char *in_p = inbuf;
	size_t inleft = inbuf + len - in_p;

	do {
	    size_t outleft = outbufsize;
	    char *out_p = outbuf;
	    size_t r = iconv(cd, &in_p, &inleft, &out_p, &outleft);

	    /*
	     * 出力バッファの要領が足りないときは errno に 
	     * E2BIG がセットされるが、これは無視していい。
	     */
	    if (r == (size_t)-1 && errno != E2BIG) {
		perror("iconv");
		abort();
	    }

	    /* 
	     * iconv は out_p の末尾に '\0' をつけてくれないので、
	     * 長さを指定して出力する必要がある
	     * 長さは outbufsize - outleft で計算できる
	     */
	    printf("%.*s", (int)(outbufsize - outleft), outbuf);

/*  	    printf(">> %d %d %d %d\n",  */
/*  		   (int)inbuf, (int)outbuf, (int)in_p, (int)out_p); */
/*  	    printf(">> %d, %d\n", inleft, outleft); */
	} while (inleft != 0);
    }
    iconv_close(cd);

    return 0;
}