Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Why EUCJP?
- From: Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx>
- Date: Sat, 21 Oct 2000 23:37:04 +0900
- X-ml-name: namazu-devel-ja
- X-mail-count: 01030
- References: <200010210930.SAA12609@mail2.rim.or.jp>
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;
}