Not only is the Internet dead, it's starting to smell really bad.:2004年07月18日分

2004/07/18(Sun)

(ry

@CNS11643-1

http://www.unicode.org/charts/PDF/U2F00.pdf
http://www.cns11643.gov.tw/web/show_seek8.jsp?start=10017&end=10553&stroke=&page=1
を比較するとU+2F23が抜けているのは何故?
そもそも部首についてCNSはUCSへの変換テーブル掲載してないし。

@wctype linear search -> binary search

偏ったデータでなしに、青空文庫からひろってきたテキストを使って測定してみると、
EUC-JPやSJISでも僅かながら性能は向上してますな。
UTF-8だと差は歴然。
singlebyte localeでは_NBRuneLocale->rl_{runetype, maplower, mapupper}が使われるので、
この変更の影響は受けない訳だし、OKかな。

@vfwscanf(3)

vfscanfの%lc(%C)とか%ls(%S)対応をやっててふと
http://www.haun.org/ml/b-l-j/a/100/111.html
「バイト系関数とワイド系関数の混在利用を制限」を思い出したんだけど

char c;
wchar_t wc;

setlocale(LC_CTYPE, "ja_JP.SJIS");
wscanf("%c %C", &c, &wc);

みたいなケースでは、

  %c  →  fgetc(stdin)
  %C  →  fgetwc(stdin)

(あるいは同等の処理)が内部で動くので、formatの書き方ひとつで
「バイト系関数とワイド系関数の混在利用」が発生しそうなんだけど。

上のコードでstdinに { 0x82, 0xA0, 0x82, 0xA2 }というbyte sequenceを喰わすと

  1. c = 0x82, wc = EILSEQ(0xA082)
  2. c = 0x82, wc = 0x82A2

のどっちが正しいんでしょうか。

ちなみにFreeBSDのvfwscanf()は%cであってもfgetwc()が使われるので後者。
漏れは前者が正しいような気がするんだけど。。。

@ungetwc(3)

/diary/?20040118#18-1-1
/diary/?20040123#23-1-1
↑の問題については「混在利用する香具師が悪い」でいいのか。

でもさ、やっぱり戻せないと

FILE *fp;
wchar_t wc;
size_t n;
...
ungetwc(L'あ', fp);
fwscanf(fp, "%C %n", &wc, &n);


というコードで、nはいくつになるか判らんという事態になるのよね。