蝉は、やがて死ぬる午後に気づいた。ああ、私たち、もっと仕合せになってよかったのだ。:2008年03月21日分

2008/03/21(Fri)

[NetBSD] nl_langinfo(CODESET) ? locale_chartset() ?

CSIに書き直した xvmwareだけんど、またまた非常にダメぽなバグあった *1んと
libc builtinのiconv(3)を使わずにGNU libiconvを使う必要がある場合
対策が必要なのを忘れてたので修正しますた。
#まだバグあるかも。

GNU libiconvを使う場合、nl_langinfo(CODESET)が返す文字列を解釈できるかは
保障されないので、この場合同梱のlibcharsetのlocale_charset()を使えとなっているのよね
(例えばNetBSDはC/POSIXロケールでは"646"を返すけど、GNU libiconvはこれを解釈できない)。

んで、locale_charset()はsetlocale(LC_CTYPE, NULL)の戻り値を元に
現在のlocaleのCESを調べ、GNU libiconvが解釈できるよにcanonicalizeする。
#つかそーゆーことはlibiconvの中で閉じてやって欲しいよ orz

ちなみに-DX_LOCALEつきでXlibをcompileした場合のケアは無いもより。
やるなら<locale.h>の代わりに<X11/Xlocale.h>をinclude、
んで定義ファイルを書いてlibcharsetを再コンパイルだ罠。
まあ今更-DX_LOCALEなんぞ使うべからず、が正解。
#まだOpenBSDあたりで使ってる人はいるかもしれんけど。

*1:必殺テストしてませんが何か?

GNU libiconv

locale_charset() + libcharsetネタに補足。
GNU libiconvは

iconv_open("", "UTF-8");

のように、""を引数に渡すと、現在のlocaleのCESが指定されたものと解釈し
内部的にlocale_charset()を呼ぶようになってます(って今知ったwww)が
当然移植性は**まったく無い**ので注意ね、ったくもう。