2009/11/01(Sun)
○[i18n] AIX multi-locale implementation
いえいえ、OSF/1由来のPOSIX locale実装をベースにしたやつなんですが
かといって
Distributed I18N Frameworkでもないし、ってやつですね。
機能的には
Thread Aware Locale Extensionよりもしょぼいです。
locale objectの定義とconstructor/destructorはこんなの。
typedef void* __xlocale_ptr;
__xlocale_ptr __xopen_locale(const char *);
void __xclose_locale(__xlocale_ptr);
__xopen_localeにLC_*なカテゴリ指定がないのはまぁ正しい実装やね。
せっかくmulti-localeなんだからカテゴリはもはや意味ないよ>>TALE
Javaのjava.util.Localeもそういう実装ですな。
ただ、printf系なんかだと数値フォーマットはen_USで、照合順序はja_JPでとか
必要になるので、java.text.Formatみたいに分離する必要あるけど。
#なぜかjava5でSystem.out.printf入って退化したけどな、Java。
以下の関数は、第一引数に__xlocale_ptrをとる以外は非multi-locale版と同じプロトタイプ。
- マルチバイト・ワイド文字(列)変換
[locale.h] [_LC_core_charmap_t] [SUSv3] __xmbtowc __mbtowc mbtowc __xmbstowcs __mbstowcs mbstowcs __xwctomb __wctomb wctomb __xwcstombs __mbstowcs mbstowcs __xmblen __mblen mblen __xwcswidth __wcswidth wcswidth __xwcwidth __wcwidth wcwidth /* http://publib.boulder.ibm.com/infocenter/systems/topic/com.ibm.aix.files/doc/aixfiles/Locale_Method.htm */ __x__mbtopc __mbtopc (__mbtopc) __x__mbstopcs __mbstopcs (__mbtopcs) __x__pctomb __pctomb (__pctomb) __x__pcstombs __pcstombs (__pcstombs) __xcsid __csid __xwcsid __wcsid __x__getmbcurmax N/A MB_CUR_MAX __xmbrtowc N/A mbrtowc __xwcrtomb N/A wcrtomb
wcs?widthは文字の属性情報なので、ここより_LC_core_ctype_tの方が
相応しいのだけども、SUSv3もwctype.hじゃなしにwchar.hなのよな。 - 文字クラス分類
[locale.h] [_LC_core_ctype_t] [SUSv3] __xtowupper __towupper towupper __xtowlower __towlower towlower __xget_wctype __get_wctype (get_wctype) __xis_wctype __is_wctype (is_wctype) __xtoupper N/A toupper __xtolower N/A tolower __xisalnum N/A isalnum __xisalpha N/A isalpha __xisblank N/A (isblank) __xiscntrl N/A iscntrl __xisdigit N/A isdigit __xisgraph N/A isgraph __xislower N/A islower __xisprint N/A isprint __xispunct N/A ispunct __xisspace N/A isspace __xisupper N/A isupper __xisxdigit N/A isxdigit __xiswalnum N/A isalnum __xiswalpha N/A iswalpha __xiswblank N/A iswblank __xiswcntrl N/A iswcntrl __xiswdigit N/A iswdigit __xiswgraph N/A iswgraph __xiswlower N/A iswlower __xiswprint N/A iswprint __xiswpunct N/A iswpunct __xiswspace N/A iswspace __xiswupper N/A iswupper __xiswxdigit N/A iswxdigit
is*とかisw*が_LC_core_ctype_tにないのは全部これ直接テーブルを参照してるかis_wctype呼んでるからぽ。 - 文字照合順序
[locale.h] [_LC_core_collate_t] [SUSv3] __xstrcoll __strcoll strcoll __xstrxfrm __strxfrm strxfrm __xwcscoll __strcoll strcoll __xwcsxfrm __strxfrm strxfrm __xfnmatch __fnmatch fnmatch N/A __regcomp regcomp N/A __regerror regerror N/A __regexec regexec N/A __regfree regfree /* undocumented, obsoleted interface derrived from OSF/1 */ __xNCcollate N/A (NCcollate) __xNCcoluniq N/A (NCcoluniq) __xNCcolval N/A (NCcolval) __x_NLxcol N/A __x_NCxcol N/A __x_NLxcolu N/A __x_NCxcolu N/A
- 時刻フォーマット
[locale.h] [_LC_core_time_t] [SUSv3] __xstrftime __strftime strftime __xstrptime __strptime strftime __xwcsftime __wcsftime wcsftime __x__isowcsftime N/A
- 通貨フォーマット
[locale.h] [_LC_core_monetary_t] [SUSv3] __xstrfmon __strfmon strfmon
- 数値フォーマット
[locale.h] [_LC_core_numeric_t] [SUSv3] なし
- メッセージフォーマット
[locale.h] [_LC_core_resp_t] [SUSv3] __xrpnmatch __rpnmatch rpnmatch
- locale共通
[locale.h] [_LC_core_locale_t] [SUSv3] __xnl_langinfo __nl_langinfo nl_langinfo __xlocaleconv __localeconv localeconv
(追記)
#define _MULTILOCALE_API
#include <locale.h>
すると使えまふ。