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あたりで使ってる人はいるかもしれんけど。
○ GNU libiconv
locale_charset() + libcharsetネタに補足。
GNU libiconvは
iconv_open("", "UTF-8");
のように、""を引数に渡すと、現在のlocaleのCESが指定されたものと解釈し
内部的にlocale_charset()を呼ぶようになってます(って今知ったwww)が
当然移植性は**まったく無い**ので注意ね、ったくもう。