BBSˮľÇ廪վ¡Ã¾«»ªÇø
·¢ÐÅÈË: reden (OFFERÂíÉÏÀ´°É¡«), ÐÅÇø: Linux
±ê Ìâ: Linux µÄÖÐÎÄ»¯ÎÊÌâ¼ò½é
·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun Mar 7 20:52:35 1999)
×÷Õß°´
µ×ÏÂÕâÆªÎÄÕÂÊÇÎÒ×î½üд³ÌʽµÄÒ»µãµãÐĵ㬳ýÁËǰ¶Î
²¿ÌÖÂÛÁË Linux I18N »·¾³Íâ (ÒÑÔÚ Linux Á¬Ïß°æÌù
³ö)£¬áá°ë²¿»¹¼ÓÁËһЩÓÐ¹Ø I18N ³Ìʽд×÷µÄ¼ò½é¡£
ÎÒÏëÕâÆªÎÄÕ¾ͷ¢±íÔÚ CLDP ÉÏ£¬ Ï£Íû CLDP ¿ÉÒÔÊÕ
¼¡£¸üÏ£ÍûÕâÆªÎÄÕ¶ÔÓÐÐËȤµÄÅóÓÑÓаïÖú£¬ Èôó¼Ò
ÄÜÔçÈÕ½øÈë I18N µÄÊÀ½ç :-))
ÓÉì¶ÎÒËùÖªºÜÓÐÏÞ£¬ËùÒÔÎÄÕÂÖпÉÄÜÓкܶà´íÎ󣬶ø¹Ø
ì¶ Xi18n µÄ²¿·Ö£¬ ÎÒÒ²ÓкܶàÒòΪûÓÐÈ¥Ñо¿£¬¹ÊÂÔ
¹ý²»ÌáÁË¡£ Òò´Ë£¬Ï£Íû¸÷λ¸ßÊÖÄܶà¶à¸øÎÒÅúÆÀÓ뽨
Ò飬 »ò°ïæÎÒ½«²»×ãÖ®´¦²¹Æë£¬ÈÃÕâÆªÎÄÕ¸üÍêÃÀ¡£
ÔÚ´ËÏÈлл¸÷λ¡£
л¶«º² (Tung-Han Hsieh) <
thhsieh@twcpro.phys.ntu.edu.tw>
Linux µÄÖÐÎÄ»¯ÎÊÌâ¼ò½é
Ò»¡¢Ç°ÑÔ:
×î½üÕâ¸ö»°Ìâ´ó¼Ò³³µÃÓеãÀ÷º¦£¬´ó¼Ò¶¼Ï£Íû Linux ÄÜÔÚÖÐÎÄ·½ÃæÓÐ
Ëù½ø ²½£¬¸÷¼ÒÓи÷¼ÒµÄ˵·¨£¬ÄªÖÔÒ»ÊÇ¡£ÓÉì¶ÎÒ×î½ü³£Óë CLE µÄ
group ÓÐÁªÏµ£¬ ͬʱҲÕýÔÚдһЩÓëÖÐÎÄÏà¹ØµÄ³Ìʽ£¬Òò´ËÎÒ´óÂÔ˵
һϡ¸ÎÒÃÇÕýÔÚ×öʲ÷᡹£¬ Èôó¼Ò²Î¿¼¡£
ÎÒÏ£Íû´ó¼ÒÄܽ«ÕâÆªÎÄÕµ±×ö¼¼ÊõÐÔÎÄÕÂÀ´¶Á£¬²»ÒªÔÙÓÐÇéÐ÷»¯µÄÅú
ÆÀ£¬±Ø¾³ ÎÒÃÇÒªµÄÊÇ solution, ÇéÐ÷»¯µÄÅúÆÀ¶ÔÎÒÃÇʵÔÚûÓаï
Öú¡£³ý´ËÖ®Í⣬ÎÒµÄ¹Û µã¿ÉÄÜÓÐ´í£¬Ò²¿ÉÄܹý·ÝÀÖ¹Û£¬Ò²»¶Ó´ó¼ÒÄÜ
¾Í¼¼Êõ·½Ãæ¸øÓèÎÒÖ¸½Ì¡£
¶þ¡¢ I18N Óë locale:
Òª½« Linux ÖÐÎÄ»¯£¬³¯Öø±ê×¼×ß²ÅÊdz¤Ô¶Ö®¼Æ¡£¸÷λÈç¹ûÓмû¹ý½ü´ú
ÉÌÒµ°æµÄ UNIX ¾Í»áÏþµÃ£¬ËüÃÇ¡¸ÖÐÎÄ»¯¡¹Ö®³¹µ×£¬ÁîÈ˾ªÌ¾£¬ÖîÈç
ÖÐÎÄÑ¡µ¥¡¢ÖÐÎÄѶϢ .... ÄúÄÜÏëÏñµÃµ½£¬»ò˵ֻÄÜÔÚ Win95/98/NT
OS/2 .... µÈÉÏÍ·²Å¼ûµÃµ½µÄ ÖÐÎÄ»·¾³£¬ËüÃǶ¼ÓС£È»¶ø£¬ËüÃǵÄÖÐ
ÎIJ¢²»ÊÇÏñĿǰ Linux Éϳ£¼ûµ½µÄÄÇÑù£¬ ÓÉÒ»¶Ñ³ÌʽÆßÆ´°Ë´Õ³öÀ´
µÄ£¬ËüÃÇÈ«²¿¶¼ÊÇ×ñÑÒ»¸ö±ê×¼: I18N ¡£
I18N ÊÇ InternationalizatioN (¹ú¼Ê»¯) µÄËõд£¬µÚÒ»¸ö×Ö I Óë×î
ááÒ»¸ö×Ö N Ö®¼äÓÐ 18 µÄ×Öĸ£¬¹ÊÃû¡£ I18N ²¢²»ÊÇÖ»ÓбíÃæÉϽ« X
Window ¡¸¹ú¼Ê»¯¡¹ ¶øÒÑ£¬ËüÊÇ¡õ»ùÔÚ×îµ×²ãµÄ libc ÉÏ¡£ libc ±Ø
ÐëÒªÓÐ locale µÄÖ§Ô®£¬²ÅÄÜÏò I18N Æð²½¡£
ʲ÷áÊÇ locale? ¼òµ¥Ëµ¾ÍÊÇÒ»×顸µØÇøÓïÑÔ¡¹µÄ×ÊѶ¡£Ëü°üÀ¨ÁË (Ïê
¼û man setlocale):
LC_CTYPE: ×ÖÔª¶¨Òå
LC_MESSAGES: ѶϢÏÔʾ
LC_TIME: ʱ¼äÏÔʾ¸ñʽ
LC_NUMERIC: Êý×ÖÏÔʾ¸ñʽ
LC_MONETARY: »õ±ÒÏÔʾ¸ñʽ
LC_COLLATE: ×Öĸ˳ÐòÓë×Ö´®±È½Ï
ÆäÖУ¬ÓëÒ»°ãʹÓÃÕß×îÓйØÏµµÄ£¬ÊÇ LC_CTYPE Óë LC_MESSAGES ¡£
LC_CTYPE Ö± ½Ó¹ØÏµµ½Ä³Ð©×ÖÔª»òÄÚÂëÔÚĿǰµÄ locale ÏÂÊÇ·ñ¿ÉÓ¡?
ÒªÈçºÎת»»? ¶ÔÓ¦µ½ÄÇ Ò»¸ö×Ö? .... µÈµÈ¡£ LC_MESSAGES Ôò¹ØÏµµ½
ÈíÌåµÄѶϢÊä³öÊÇʲ÷áÑùµÄÓïÎÄ¡£Õæ ÕýÍêÕûµÄ locale Ö§Ô®£¬Êǵ±ÎÒ
ÃÇÔÚ shell prompt Ï£¬Ö±½ÓÉèºÃ»·¾³±äÊý£¬ÔòÎÒ ÃÇÂíÉϾÍÄÜÇл»µ½
ÄǸöÓïÎÄÁË¡£ÀýÈç:
bash: export LC_CTYPE=zh_TW.Big5
ÓÐÁË locale µÄ¡¸Ð¶¨¡¹£¬Ê¹µÃÈκεØÇøµÄÓïÎÄ£¬Ö»ÒªÔÚ¼ÓÈëÊʵ±µÄ
locale data Ö®áᣬ libc ¾ÍÄÜÕýÈ·µØ´¦ÀíËüÁË£¬¶øÎÒÃǵġ¸ÖÐÎÄ¡¹
µ±È»Ò²²»ÀýÍâ¡£ÓÉì¶Ç°ÈËÓë CLE group µÄŬÁ¦£¬Ä¿Ç°ÎÒÃÇÒÑÓÐ×Ô¼ºµÄ
locale data ÁË¡£Óа²×° CLE µÄÅóÓÑ¿É ÒÔµ½ /usr/share/locale ÏÂ
¿´¿´£¬ zh_TW.Big5 ¾ÍÊÇÎÒÃÇµÄ locale data, ËäÈ»»¹ ²»¹»ÍêÕû£¬µ«
ÒÑÄÜ work¡£
Ŀǰ Linux ¶Ôì¶ locale µÄÖ§Ô®ÈçºÎ? ¿ÉÒÔ´ó¸ÅµØËµ£¬Î÷·½Óïϵ²î²»
¶àûÎÊÌâÁË£¬ µ«¶«·½Óïϵ»¹Óв»ÉÙÎÊÌâ¡£Èç¹ûÄúµÄ Linux ϵͳÊÇÓÃ
libc5 (ÀýÈç Slackware) µÄ»°£¬ÄDz¶à¿ÉÒÔ˵֧ԮµÃÏ൱²î£¬¼¸ºõ
Ö»ÄÜ¿¿¡¸ÆßÆ´°Ë´Õ¡¹µÄ·½·¨À´ÓÐÏÞ¶ÈµØ Ê¹ÓÃÖÐÎÄ¡£Èç¹ûÊÇÓà libc6
(glibc2) µÄ»°£¬ÄǾÍÓÐÏ൱µÄ locale Ö§Ô®ÁË¡£
È»¶ø£¬Ä¿Ç°´ó²¿·ÖʹÓà glibc2 µÄϵͳ¶¼ÊÇ glibc-2.0.7, ÕâÒ»°æ¶Ô
¶«·½ÓïϵµÄÖ§ Ô®»¹²»¹»ºÃ£¬ÌرðÊÇ LC_CTYPE £¬ËüÎÞ·¨±æÈÏ¡¢×ª»»ÎÒ
ÃÇµÄ Big5 Â룬±ØÐëÒªµÈµ½ glibc-2.1 ÒÔáᣬ²ÅÄÜÍêÈ«½â¾öÕâЩÎÊ
Ìâ¡£µ«Õâ²¢²»ÊÇ˵ʹÓà glibc-2.0.7 µÄ¹ã ´óʹÓÃÕß¶¼Ã»Ï£ÍûÁË£¬ÊÂ
ʵÉÏÓÐÒ»¸ö libwcsmbs µÄÌ×¼þ£¬Ëü¿ÉÒÔ½« glibc ÖÐÓÐÎÊ ÌâµÄ²¿·ÖÈ¡
´úµô£¬ÈÃÎÒÃÇµÄ LC_CTYPE ²¿·Ö¿ÉÒÔ¡¸¼¸ºõ 90% ÕýÈ·¡¹µØ¹¤×÷¡£¶øÕâ
¸ö Ì×¼þ¾ÍÊÇĿǰ CLE µÄ±ê×¼Ö®Ò»£¬Ò²ÊǺÜÖØÒªµÄÒ»¸ö²¿·Ö£¬ËäÈ»´ó
¼Ò¿ÉÄܸÐÊܲ»µ½Ëü µÄ´æÔÚ¡£
×î½ü glibc-2.1 µÄ pre-release ÒѾ³öÀ´£¬ÎÒ¸öÈËÒÑ×ö¹ý³õ²½²â
ÊÔ£¬ LC_CTYPE ÔÚÎÒÃÇµÄ locale ÏÂÒѾÕý³££¬ËäÈ»ÈÔÓÐÆäËûÎÊÌâ´æ
ÔÚ£¬µ«ÕâÒÑÊÇÒ»¸öºÃÏûÏ¢£¬ÎÒ Ô¤¼ÆÔÚδÀ´µÄÒ»ÄêÄÚ£¬µÈ´ó²¿·ÖµÄ
Linux distribution ¶¼»»×°ÁË glibc-2.1 Ö® áᣬÎÒÃǾÍÓÐÁË×îµ×²ã
µÄ¡¸ÖÐÎÄ»¯¡¹Ìõ¼þ¡£
Èý¡¢ X Window µÄ²¿·Ö:
½ÓÖøÎÒÃÇÀ´¿´¿´Éϲ㣬 X Window µÄ¡¸ÖÐÎÄ»¯¡¹ (»ò¡¸¹ú¼Ê»¯¡¹)¡£
X11R6 Ò²ÓÐÒ» ¸ö locale µÄĿ¼£¬·ÅÔÚ /usr/X11R6/lib/X11/locale
¡õÍ·£¬Èç¹ûÊÇ×° CLE µÄÅó ÓÑ£¬¾Í»á¼ûµ½Ò»¸ö zh_TW.Big5 µÄĿ¼£¬
ÄǾÍÊÇÎÒÃÇµÄ XLC Locale data¡£ÔÚ¡¸±ê ×¼¡¹µÄÇé¿öÏ£¬ XLC
Locale ±ØÐë¼Ü¹¹ÔÚ libc locale Ö®ÉÏÔË×÷£¬Ëü¡õÍ·³ýÁ˶¨ ÒåһЩ×Ö
Ôª¶ÔÓ¦£¬×îÖØÒªµÄÊÇÄÚÂëÓë×ÖÐ͵ĶÔÓ¦¡£ÒÔÎÒÃÇµÄ locale ΪÀý£¬ÎÒ
ÃÇÐè ÒªÁ½ÖÖ×ÖÐÍ£¬Ò»ÊÇ¡¸°ëÐÎ (µ¥Î»Ôª)¡¹£¬ÏÔʾ ASCII ÂëÓã¬ÁíÒ»
ÊÇ¡¸È«ÐÎ (˫λԪ)¡¹ ÓÃÀ´ÏÔʾÖÐÎÄ¡£¾ÙÒ»¸öÀý×Ó£¬ÏñÒÔÏÂÕâÒ»´®×Ö:
ÕâÊÇÒ»¸ö abcd .... ²âÊÔ×Ö´® string! £Ï£Ë£¡
ÄÇЩҪÓÃÈ«ÐÎÏÔʾ? ÄÇЩҪÓðëÐÎÏÔʾ? Õâ±ØÐë¿¿ libc µÄ LC_CTYPE
À´Åжϡ£Òò ´Ë£¬ LC_CTYPE Èç¹û¹Òµô£¬¿ÉÒÔ˵ʲ÷ᶼûéü¡£
ÎÒÏàÐÅ£¬ÓÐÁËÉÏÊöµÄ¡¸Å䱸¡¹áᣬ»ù±¾µÄ I18N »·¾³¾ÍÒѾ¾ß±¸ÁË¡£
µ«Ò»¶¨ÓÐÈË»á ÎÊ: ¡¸¿´ÆðÀ´ CLE ÔÚÉÏÊöËù˵µÄ¶¼Ã»ÎÊÌ⣬Ϊʲ÷ỹ
Êǵ½´¦¶¼²»ÊÇÖÐÎÄ?¡¹ û´í£¬ ÄÇÊÇÒòΪĿǰ Linux Éϴ󲿷ֵijÌʽ
»¹²»ÊÇÓà I18N µÄ±ê×¼¶øÐ´µÄ¡£ÀýÈç´ó¼Ò³£Óà µÄ Netscape, xcin,
crxvt .... µÈµÈ£¬ËüÃǶ¼ÊÇÓá¸×Ô¼º¡¹µÄÕÐÊõÀ´´¦ÀíÖÐÎÄ£¬ ÕâÒ²¾Í
ÊÇΪʲ÷á xcin Ö»ÄÜÔÚ crxvt ÉÏÊäÈ룬Ϊʲ÷áÎÒÃÇÒª¿¿ CXWin À´¿´
ÖÐÎÄ .... µÈµÈ¡£ÕâЩ¶¼²»ÊÇÕý½â£¬Ö»ÊÇÔÝʱµÄÒ»¸öÊֶΣ¬×îáá¶¼ÊÇ
Òª·ÅÆúµÄ¡£
Ŀǰ£¬ÓÐÔ½À´Ô½¶à³Ìʽ½«³¯Ïò I18N À´·¢Õ¹£¬¶øÎÒÃÇĿǰ×îÐèÒªµÄ¹¤
×÷£¬¾ÍÊÇŪ I18N µÄ zh_TW.Big5 ²¿·Ö¡£¾Ù¸öÀý×Ó£¬Ä¿Ç° CLE group
ÕýÃ¦ì¶ GNOME µÄÖÐÎÄ»¯£¬ ËüËãÊÇĿǰ I18N »¯Ï൱³¹µ×µÄÒ»¸ö X
Disktop / Window Manager, Platin Ô¤¼Æ ÔÚÏÂÒ»°æµÄ CLE ¾ÍÊÇÒÔ
GNOME ΪÖ÷£¬Ö»Òª½«ÆäÖеÄѶϢ¶¼·Òë³ÉÖÐÎÄ£¬×öºÃ LC_MESSAGES µÄ
¹¤×÷£¬Î´À´ÔÚ GNOME ÖУ¬½«²»ÐèÒªÒÀ¿¿ CXWin, ´ò¿ªáá¾Íµ½´¦¶¼ ÊÇ
ÖÐÎÄ¡£
ÆäËûµÄ GNU ÈíÌåÒ²ÊÇ£¬ÓÐÁíÒ»×éÈËÂíÕý½«Ò»Ð©³£¼ûÖ¸ÁîÈç ls, cp µÈ
µÄѶϢÖÐÎÄ »¯£¬²¢½«½á¹û»Ø±¨¸ø GNU, ÆÚÍûδÀ´Ð°æµÄ GNU ÈíÌå
ÖУ¬ÖÐÎÄѶϢ¾ÍÊDZê×¼µÄÒ» ²¿·Ö£¬ÎÒÃDz»ÔÙÐèҪÿ´ÎÈ˼Ҹüаæ¾Í¼±
¼±Ã¦Ã¦µØ×ö patch ÁË¡£
ÖÐÎÄÊäÈë¾Í±È½Ï¸´ÔÓ£¬³ýÁËÉÏÊöµÄ I18N ÒÔÍ⣬»¹ÓÐÒ»¸ö XIM (X
Input Method) ж¨¡£ÎÒÃDZØÐëÒªÓÐ XIM server À´È¡´úĿǰµÄ
xcin, ¶øÇÒ»¹Òª X Window µÄÓ¦ ÓóÌʽÄܹ»×ñÑ XIM ж¨£¬²ÅÄÜ×ö
µ½ "Chinese Input Anywhere"¡£Ä¿Ç° CLE ÒÑ ÓÐÒ»¸ö XIM server,
¼´ xcin-cxim Ö®ÀàµÄ³Ìʽ£¬µ«Âé·³µÄÊÇ×ñÑ XIM ж¨µÄÓ¦ ÓóÌʽÈÔ
²»¶à£¬×îÖøÃûµÄ¾ÍÊÇ GNOME, xemacs, ÒÔ¼°Ò»Ð© X11R6 Ëù¸½µÄÈíÌå
(Èç xedit, ÓÉ Xt ¼° Xaw Ìṩ I18N Ö§Ô®)¡£¶øÎÒ¸öÈËĿǰÕýÔÚдµÄ
xcin-2.5 ¾ÍÊÇÒ»¸ö XIM server, ÎÒÏ£ÍûÕâ¸öÈíÌåÄÜÔÚ½«À´Ó롸¸÷·
ÈËÂí¡¹ÅäºÏ£¬×ö³öÒ»µã¹±Ïס£
Òò´Ë£¬¡¸ÖÐÎÄ»¯¡¹µÄ¹¤×÷£¬²¢²»ÊÇÄÇ÷á¼òµ¥µØËµ¡¸ÒòΪ Linux ÊÇÃâ
·Ñ¡¢Ã»ÓÐÈ˸¶ Ç®¸ø³ÌʽÉè¼ÆÊ¦£¬ËùÒÔ×ö²»ºÃ¡¹£¬»òÕß˵¡¸ÎÒÃÇÖйúÈË
²»ÍŽᣬ´ó¼Ò²»¿ÏºÏ×÷·¢ Õ¹³Ìʽ¡¹£¬»òÕß˵¡¸ Linux ÊÇ server µ¼
Ïò£¬²»ÊʺÏ×öÖÐÎÄ¡¹ .... µÈµÈ¡£ Linux ¿ÉÒÔ·¢Õ¹ÖÐÎÄ£¬¶øÇÒÓкܶà
ÈËÕýŬÁ¦µØÔÚ¹¤×÷£¬µ«ÊǸüÖØÒªµÄÊÇ£¬ÎÒÃÇ»¹µÃÅäºÏ¹ú Íâ (»ò˵ÈíÌå
µÄÔÉè¼ÆÕß) µÄ½Å²½¡£Ç°ÃæËµ¹ý£¬ÎÒÃÇÒªÓÐÍêÕû locale Ö§Ô®µÄ
libc, ÕâÒ»ÇвÅÓÐÏ£Íû£¬ÎÒÃÇÒ²ÐèÒªÎÒÃdz£ÓõÄÈíÌå (Èç Netscape,
window manager, ÉõÖÁ database, office ....) µÄÉè¼ÆÕß¾õÎòµ½£¬
ÕæÕýµÄ±ê×¼ÊÇ I18N, ÊÇ locale, ÊÇ XIM, ÎÒÃDzÅÄܸú½ø£¬½«ÖÐÎÄ»¯
µÄ²¿·Ö¼Ó½øÈ¥¡£¸üÖØÒªµÄÒ»µã£¬ÎÒÃÇ×Ô¼ºµÄ³Ìʽ Éè¼ÆÊ¦ÔÚдÈíÌåʱ£¬
ÊDz»ÊÇÒ²ÄÜ×ñÑ I18N, locale, XI
¹©²Î¿¼£¬Ò²Çë¸÷ λ¶à¶à¸øÓèÎÒÅúÆÀÓëÖ¸½Ì¡£
1.µÚÒ»²½: setlocale (Ïê¼û man setlocale ÓëÆäËûÏà¹Ø man
page)
³ÌʽµÄµÚÒ»²½±ØÐëÒªÉ趨 locale, ¶øÒ»°ãµÄд·¨ÊÇ locale ×ÊÁÏ
ÊǾÓÉ»·¾³±äÊýÈ¡ µÃ£¬¶ø²»ÒªÐ´ËÀÔÚ³Ìʽ¡õÍ·£¬ÀýÈç:
#include
main()
{
setlocale(LC_ALL, "");
.....
}
»ò·Ö±ðÉ趨:
setlocale(LC_CTYPE, "");
setlocale(LC_MESSAGES, "");
.....
ÎÒ¸öÈ˵Ľ¨ÒéÊÇ£¬ÔÚ setlocale() ʱֻҪÉèÎÒÃdzÌʽÖÐÐèÒªµÄÏî
Ä¿¼´¿É£¬¶ø²»ÒªÉè LC_ALL, ÔÒòÊÇÔÚijЩ locale Ï (ÈçÎÒÃǵÄ
zh_TW.Big5), ²¢·ÇËùÓеÄÏîÄ¿¶¼ÄÜ ÕýÈ·ÔË×÷¡£ÎÒÏë¶Ô´ó²¿·ÖµÄ
³Ìʽ¶øÑÔ£¬ÉèºÃ LC_CTYPE Óë LC_MESSAGES ¾Í²î²»¶àÁË£¬ ¹ÊÒÔ
ÏÂÎÒÕë¶ÔÕâÁ½¸ö×ö˵Ã÷¡£
2.wcs. vs. mbs. (Ïê¼û man mbstowcs ÓëÏà¹Ø man page)
"wcs" ÊÇ "wide-chararater string" µÄËõд£¬¶ø "mbs" ÊÇ
"multi-byte string" µÄËõд£¬¶þÕß·Ö±ð´ú±í×Ö´®µÄ±íÏÖ·½Ê½¡£
ËùνµÄ multi-byte ÊÇÖ¸Êý¸ö char ×é³É Ò»¸ö×Ö (ÈçÈ«ÐÎ×Ö»òÖÐ
ÎÄ×ÖÊÇÓÉÁ½¸ö char ×é³É)£¬¶ø wide-char ÊÇÖ¸Ò»¸ö wchar_t
type ¾ÍÊÇÒ»¸ö×Ö, ¶ø sizeof(wchar_t) µÄ´óСÓëϵͳÓйأ¬Ò»
°ã¶øÑÔÊÇ 4 bytes¡£ Ò»°ãÎÒÃÇ¿ÉÒÔÖ±½Ó¿´¡¢Êä³öÊäÈëµÈ¶¼ÊÇ
multi-byte, Èç:
char *str = "ÕâÊÇÒ»¸ö¾ä×Ó: abcd";
µ«ÎÒÃǻὨÒéÔÚ³ÌʽÄÚ²¿£¬Óà mbstowcs() ½«Ëüת³É wchar_t À´
ͳһ´¦Àí£¬Õâ¸ö ת»»ÆäʵÊǸù¾Ý locale ÖÐµÄ LC_CTYPE µÄ»ú
ÖÆ£¬Ëü¶¨ÒåÁË multi-byte Óë wide- char Öµ¶þÕß¼äµÄ¶ÔÓ¦¹Ø
ϵ¡£×öÕâÑùת»»µÄºÃ´¦ÊÇ£¬Äú²»Óõ£ÐÄÈ«ÐΡ¢°ëÐεÄÎÊÌ⣬ ÒòΪ
Ò»¸ö wchar_t ¾ØÕóÔª¾ÍÊÇÒ»¸ö×Ö¡£
wchar_t ÓÐÒ»×éÓë string.h ÖÐÏà¶ÔÓ¦µÄ×Ö´®´¦Àíº¯Ê½ (ĿǰÔÚ
Linux ÖпÉÄÜ»¹Ã» ÓÐ man page ˵Ã÷)£¬¾Í¶¨ÒåÔÚ wchar.h ÖУ¬
ÈÃÎÒÃÇ¿ÉÒÔÈçͬ´¦Àí (char *) ÄÇÑù µØ´¦Àí (wchar_t *), Æä²¿
·ÖµÄ¶ÔÓ¦¹ØÏµÈçÏ£¬ÆäËûµÄ¿ÉÒÔÖ±½Ó¿´ wchar.h µÄÄÚÈÝ:
wcscpy() <====> strcpy()
wcsncpy() <====> strncpy()
wcslen() <====> strlen()
wcsdup() <====> strdup()
wcscmp() <====> strcmp()
wcsncmp() <====> strncmp()
........................................
ÓÉì¶ mbs ÂëÓë wcs ÂëµÄ¶ÔÓ¦¹ØÏµÊÇÓɸà locale µÄ LC_CTYPE
À´¾ö¶¨µÄ£¬Ò²¾ÍÊDz» ͬµÄ locale д·¨Æä¶ÔÓ¦¹ØÏµ¿ÉÄܻ᲻һ
Ñù¡£¾ÍÎÒÃÇµÄ glibc2, zh_TW.Big5 locale ¶øÑÔ£¬ÓÉ mbs ת³É
µÄ wcs ¼´Îª unicode (ÓÐ¹Ø unicode µÄ×ÊѶ¿ÉÒÔÔÚ
http://www.unicode.org/ ÖÐÕÒµ½)£¬µ«²»Äܱ£Ö¤ÔÚÆäËûµÄϵͳ»ò
»·¾³ÏÂÒ²ÊÇÈç´Ë¡£ ¹Ê×î±£ÏÕµÄ×ö·¨£¬Êǽ«×Ö´®´¢´æ³É
multi-byte, È»ááÔÚ run-time ʱ²ÅÓà mbstowcs() ת³É
wide-char À´ÔË×÷¡£
3.ѶϢÊä³ö (Ïê¼û info gettext):
Ò»°ãÎÒÃdzÌʽµÄѶϢÊä³ö£¬ÊǾÓÉ stdio.h ¡õÍ·µÄº¯Ê½£¬Ö±½ÓÊä
³öµ½ stdout »ò stderr, ¶øÊä³öµÄÄÚÈÝÊÇÖ±½ÓдËÀÔÚ³ÌʽÂëÖС£
ÕâÑùµÄ³ÌʽҪ×ö¶à¹úÓïÎÄ»¯»áÔì³ÉÀ§ ÈÅ£¬ÒòΪÎÒÃDZØÐëÒªÐÞ¸ÄÔ
ʼÂ룬½«ËùÓеÄѶϢ×Ö´®·Òë³ÉÁíÒ»ÖÖÓïÎÄ¡£Òò´Ë£¬ÎÒÃÇ ±ØÐë͸
¹ý locale µÄ LC_MESSAGES À´´¦ÀíѶϢÊä³ö¡£ÆäÔÀíºÜ¼òµ¥£¬¾Í
Êǽ«³ÌʽÖÐ µÄËùÓÐѶϢ³éÀë³öÀ´£¬ÎªÃ¿Ò»¸ö locale ·Ö±ð×öºÃÒ»
¸öѶϢµµ£¬µ±³ÌʽҪÊä³öѶϢʱ£¬ Ôò͸¹ý libc µÄº¯Ê½ÒÀĿǰµÄ
locale È¥ÕýÈ·µÄѶϢµµÖÐץȡѶϢ¡£
ÔÚ´ËÎÒÓà GNU gettext ΪÀý£¬¼òµ¥ËµÃ÷ÆäÔÀí¡£ÔÚ
/usr/share/locale ÖУ¬¡õÍ·ÓÐ ¸÷ÖÖ locale µÄ×ÊÁÏĿ¼¡£¶øÃ¿
¸öĿ¼Ï£¬¶¼»áÓÐÒ»¸ö LC_MESSAGES µÄĿ¼£¬¶øÕâ ЩĿ¼¾ÍÊÇ
ÓÃÀ´·Å¸÷±ð³ÌʽµÄѶϢµµ¡£ÀýÈç:
/usr/share/locale/ja/LC_MESSAGES/prog.mo (ÈÕÎÄ)
/usr/share/locale/zh_TW.Big5/LC_MESSAGES/prog.mo (Big5)
ÆäÖÐÔÚ ja/ Ŀ¼Ï嵀 prog.mo ¾ÍÊÇ prog Õâ¸ö³ÌʽµÄÈÕÎÄѶ
Ï¢£¬¶ø zh_TW.Big5/ Ï嵀 prog.mo ¾ÍÊÇ prog Õâ¸ö³ÌʽµÄÖÐÎÄ
ѶϢ¡£¼ÙÉèÔÚ»¹Ã»¼ÓÈë LC_MESSAGES Ö§ Ԯ֮ǰ£¬ prog.c ³¤µÃ
ÏñÕâÑù:
#include
main()
{
printf("This is a test string.\n");
}
ÏÖÔÚÎÒÃÇÒªÓà gettext À´¼ÓÈëÖ§Ô®£¬Ôò³ÌʽֻҪ¸Ä³É:
#include
#include
#define _(STRING) gettext(STRING)
#define PACKAGE "prog"
main()
{
setlocale(LC_MESSAGES, "");
textdomain(PACKAGE);
/* Õâ¡õ¾ÍÊÇÖ¸¶¨ÓÃ
/usr/share/locale/$LOC/LC_MESSAGES/prog.mo
×÷ΪѶϢµµ¡£ÆäÖÐ $LOC ÊÇÔÚ setlocale ÖÐÉ趨µÄ */
printf(_("This is a test string.\n"));
/* ʹÓà gettext À´×¥³öѶϢ£¬ÔÙ½»¸ø printf À´Ó¡ */
}
Èç¹ûÔÚÖ¸¶¨µÄ locale ÏÂÕÒ²»µ½ prog.mo µµ£¬Ôò³Ìʽ¾ÍÖ±½ÓÒÔÔ
Ó¢ÎÄѶϢӡ³ö¡£Òò ´Ë£¬¼ÓÈë LC_MESSAGES µÄÖ§Ô®£¬Ô source
code Ð޸IJ¢²»¶à£¬ÆäʵÏ൱·½±ã¡£
±È½ÏÂé·³µÄÊǸ÷ locale ϵÄѶϢµµÖÆ×÷£¬¶øÕâЩ²½Öè¿ÉÒÔ¾ÓÉ
GNU gettext Ì×¼þ ºÜÈÝÒ׵شï³É£¬Æä²½Öè¼òÊöÈçÏ (Ïê¼û info
gettext):
xgettext editor msgfmt (install)
source code --> .pot --> .pox --> .gmo --> .mo -->
(½Ú¼×Ô Platin.bbs@csie.nctu.edu.tw µÄÎÄÕÂ:
[REF] ¹Øì¶ gettext (Ò»¡¢¼ò½é))
ʹÓà xgettext ²úÉú .pot µµ:
xgettext -a -o prog.pot prog.c
¶ø prog.pot µµµÄÄÚÈÝÈçÏÂ:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR , YEAR.
#
#: prog.c:8
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 1999-02-28 19:18+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
#: prog.c:10
msgid "This is a test string.\n"
msgstr ""
¸÷λ¿ÉÒÔ×¢Òâµ½µ¹ÊýÁ½ÐУ¬ msgid ¾ÍÊÇÔÀ´ source ¡õÍ·
µÄÓ¢ÎÄѶϢ£¬¶øÎÒ ÃÇ¿ÉÒÔÖ±½ÓÔÚ msgstr Öн«ÔѶϢ·Òë
³ÉÖÐÎÄ¡£ËùÒÔ£¬½ÓÏÂÀ´µÄ¹¤×÷Æäʵ¾Í ÊÇ·Ò룬ÎÒÃÇ¿ÉÒÔÓÃ
ÈÎÒâµÄ±à¼Æ÷±à¼Õâ¸öµµ°¸£¬²¢½«·ÒëºÃµÄµµ°¸´æ³É
prog.pox µµ¡£
½« prog.pox ±àÒë³É prog.gmo:
msgfmt -o prog.gmo prog.pox
ÆäÖÐ prog.gmo¡£¾ÍÊÇÎÒÃÇÒªµÄѶϢµµ£¬µÈµ½ÎÒÃǰÑËü°²×°
µ½
/usr/share/locale/..../LC_MESSAGES/
Ö®áᣬ¾ÍÃû¸ÄΪ prog.mo ¡£ÔÚ´Ë£¬ .pot, pox, gmo µÈ¸½
µµÃûÊÇ info gettext Öн¨ÒéµÄ£¬·Ö±ð´ú±íδ·ÒëǰµÄѶϢ
Ôʼµµ¡¢·ÒëááµÄѶϢÔʼµµ¡¢ ¾ GNU gettext Ì×¼þ±àÒë
ááµÄѶϢµµ¡£
Æß¡¢×«Ð´ Xi18n ³Ìʽ:
Xi18n ÒâÖ¸ÔÚ X Window ÖмÓÈë I18N µÄÖ§Ô®¡£³ýÁËÉÏÊöµÄ²¿·ÖÍ⣬
Xi18n »¹ÐèÒª ¿¼ÂÇ×ÖÐÎÉ趨¡¢Í¼ÐÎ×Ö´®Êä³ö¡¢ÒÔ¼°ÊäÈëµÄÎÊÌâ¡£ÓÉì¶
ĿǰÎÒÖ»Óп´¹ý Xlib, ¶Ôì¶ ÆäËû Widget »¹Ã»ÓÐÉîÈëÑо¿£¬Òò´ËÎÒ
Ö»ÄÜ¶Ô Xlib µÄ²¿·ÖÉÔ×÷˵Ã÷¡£¶øÕâÀàµÄ²Î¿¼ ×ÊÁÏ£¬ÓÐÐËȤµÄÅóÓÑ¿É
ÒÔÕÒ
The Definitive Guides to the X Window System
ÕâһϵÁеÄÊéÀ´¿´£¬³ö°æÉÌÊÇ O'Reilly & Associates Inc. £¬ÆäÖÐ
ÓÐÁ½±¾
1.Volume One, Xlib Programming Manual (for Version 11)
Author: Adrian Nye
2.R6 Update for the R5 Editions of vols. 1, 2, 4, & 5
Programmer's Supplement for Release 6 of the X Window
System.
Author: Adrian Nye
ÔÚ I18N ·½ÃæÓÐÏ꾡µÄ×ÊÁÏ£¬ºÜÖµµÃ²Î¿¼¡£»òÕßÊÇ¿ÉÒÔ¿´¿´ XFree86
ÄÚ¸½µÄ .ps ÎÄ ¼þ (Èç¹ûÄúÓа²×°µÄ»°£¬Ó¦¸ÃÔÚ
/usr/X11R6/lib/X11/doc ¡õÍ·)¡£
1.µÚÒ»²½ (Ïê¼û man XSupportsLocale):
³ýÁË setlocale() Ö®Í⣬Äú»¹Òªºô½Ð XSupportsLocale() À´È·
¶¨ X Window ¶ÔÄú ĿǰµÄ locale ÊÇ·ñÓÐÖ§Ô®¡£ÁíÍ⣬Äú»¹Òªºô
½Ð XSetLocaleModifiers() À´É趨 һЩ X-modifier µÄÖµ£¬¡õ
ÀýÈçÏÂ:
#include
#include
#include
main()
{
setlocale(LC_CTYPE, "");
if (XSupportsLocale() != True) {
printf("error X locale setting\n");
exit(0);
}
XSetLocaleModifiers("");
}
ÔÚ´ËÎÒÃÇÓà X11/Xlocale.h À´È¡´úÔÀ´µÄ locale.h, ÕâÊÇ
"Xlib programming manual" ÊéÖн¨ÒéµÄ£¬ÔÚÆä±¸ÍêÕû locale
Ö§Ô®µÄ libc »·¾³Ï£¬ËüÆäʵÊÇµÈ¼Û ì¶ include , µ«ÈôÔÚÆäËû
»·¾³£¬ Xlocale.h »áÓà XLOCALE »úÖÆÀ´ È¡´úÔÓеĻúÖÆ¡£
ÉÏÍ·µÄ XSetLocaleModifiers »á´æ»·¾³±äÊý XMODIFIERS ÖÐÈ¡µÃ
X-modifier µÄÖµ²¢¼ÓÒÔÉ趨֮¡£ XMODIFIERS µÄ¸ñʽΪ:
export XMODIFIERS='@category=value'
Ŀǰ category Ö»ÓÐ "im" ÓÐÓã¬Èç "@im=xcin-cxims", ÒâÖ¸Éè
¶¨ xcin-cxims ×÷Ϊ´Ë X Window ³ÌʽµÄ XIM server¡£
2.É趨 fontset (Ïê¼û man XCreateFontSet):
ÒÔÍù X Window ³Ìʽ¶¼ÊǺô½Ð XLoadQueryFont() Ö®ÀàµÄº¯Ê½À´
ÔØÈ벢ʹÓÃ×ÖÐÍ¡£ µ«ÔÚ Xi18n µÄ¼Ü¹¹Ï£¬Ò»¸ö locale µÄ
encoding ͨ³£²»ÄܹâÓÃÒ»ÖÖ×ÖÐÍÀ´±íʾ¡£ ÀýÈçÎÒÃǵÄ
zh_TW.Big5, °ëÐÎ×ÖÐèÓÃÓ¢ÎÄ×ÖÐÍ (Èç -*-iso8859-1)£¬¶øÈ«ÐÎ
×ÖÐè ÓÃÖÐÎÄ×ÖÐÍ (Èç -twmoe-*-big5-0), Òò´Ë£¬ÎÒÃDz»ÄÜÓÃ
XLoadQueryFont() ½«Õâ Щ×ÖÐÍ·Ö±ðÔØÈ룬¶øÒªÓÃ
XCreateFontSet() À´ÔØÈëËùÐèµÄ fontset¡£
Display *display;
XFontSet fontset;
char *fontset_name, **missing_charset, *def_string;
int missing_charset_count;
fontset_name = "-*-iso8859-1,-twmoe-*-big5-0";
fontset = XCreateFontSet(display, fontset_name,
&missing_charset_list, &missing_charset_count, &def_stri
ng);
ÔÚÕâ¡õÎÒÃÇ¿ÉÒÔ½« fontset ¿´³ÉÒ»¸ö¡¸×ÖÐÍÎï¼þ¡¹£¬¶ø²»Òª°ÑËü
¿´³É "-*-iso8859-1" Óë "-twmoe-*-big5-0" ÕâÁ½ÖÖ×ÖÐ͵Ä×é
ºÏ¡£µ±ÎÒÃÇÒª»ÈκÎ×Ö ´®Ê±£¬ÎÒÃDz»Óõ£ÐÄÒª»µÄµ½µ×ÊÇÈ«ÐÍ×Ö
»ò°ëÐÍ×Ö£¬Ê¹Óà fontset ±ãÄܰïÎÒÃÇ ´¦ÀíÒ»ÇС£
3.»³ö×Ö´® (Ïê¼û man XwcDrawImageString, man
XmbDrawImageString, manXOpenOM)
ƽ³£ÎÒÃÇÒªÔÚÊÓ´°»×Ö´®Ê±£¬¶¼»áÓà XDrawImageString() µÈº¯
ʽ£¬»òÕßÓà XDrawImageString16() À´»Ë«Î»ÔªµÄ×Ö´® (¼´È«ÐÍ
×Ö)¡£ÏÖÔÚ¿ÉÒÔÎÒÃÇÓà XwcDrawImageString (ÓÃÀ´» wide-char
(wchar_t *) ×Ö´®) »ò XmbDrawImageString (ÓÃÀ´»
multi-byte (char *) ×Ö´®) ¡£²»¹ÜÄúÊäÈëµÄ×Ö ´®ÊÇÈ«ÐÍ»ò°ë
ÐÍ£¬»ò¶þÕߵĻìºÏ£¬Ê¹ÓÃÕßÁ½¸öº¯Ê½¶¼ÄÜÕýÈ·´¦Àí£¬Í¬Ê±»á¸ù¾Ý
ÄúµÄ fontset µÄÉ趨À´»×Ö¡£
³ý´ËÖ®Í⣬ X11R6 »¹ÓÐÒ»¸ö Output Method »úÖÆ£¬ÓÃÀ´×ö¶à¹ú
Óïϵ×Ö´®Êä³ö (»×Ö´®)£¬ÎÒÃÇ¿ÉÒÔÔÚ³ÌʽÖкô½Ð XOpenOM() À´
¿ªÆôÒ»¸ö Output Method ¡£ µ«Õⲿ·ÖÎÒ»¹Ã»ÓÐ×ÐϸÑо¿£¬ÓÐÐË
ȤµÄÅóÓÑ¿ÉÒԲο¼±¾Õ¿ªÍ·ËùÁеIJο¼×ÊÁÏ ÒÔ»ñµÃ½øÒ»²½×ÊѶ¡£
4.XIM (Ïê¼û man XOpenIM)
XIM Ó¦·ÖÁ½·½ÃæÀ´Ì¸£¬Ò»ÊÇ XIM server, ÁíÒ»ÊÇ XIM client¡£
¶Ô XIM client ¶øÑÔ£¬Èçͬ Output Method Ò»°ã£¬ÎÒÃÇ¿ÉÒÔÔÚ³Ì
ʽÖкô½Ð XOpenIM() À´¿ªÆôÒ» ¸ö Input Method, ͬʱָ¶¨ XIM
server µÄÃû×Ö¡£µ«Õⲿ·ÖÎÒ»¹Ã»ÓÐ×ÐϸÑо¿£¬ ÓÐÐËȤµÄÅóÓÑ¿É
ÒԲο¼±¾Õ¿ªÍ·ËùÁеIJο¼×ÊÁÏ¡£
ÎÒĿǰÊÇÔÚд XIM server µÄ²¿·Ö£¬µ«ÎÒûÓÐÖ±½ÓÄà X Window
µÄº¯Ê½À´Ð´£¬¶ø ÊÇÄà IMdkit lib À´Ð´£¬ÒÔ¼ò»¯Õû¸ö³Ìʽд×÷¡£
ÔÚ´ËÎÒ²»¶à×÷˵Ã÷ÁË£¬ÓÐÐËȤµÄ ÅóÓÑ¿ÉÒÔץȡ:
xcin-2.5-19990218.tar.gz
»ØÈ¥¿´£¬¡õÍ·µÄ doc/programming/ Ŀ¼ÖÐÓжԴËÉÔ×÷˵Ã÷£¬Í¬
ʱ IMdkit µÄ source Ò²Õû¸ö¸½ÔÚ xcin-2.5 source ÖС£
ÒÔÉÏ×ÊÁÏ£¬½ö¹©²Î¿¼£¬»¶Ó´ó¼ÒÖ¸½Ì¡£ Ö
--
ÔÚ½ºþÖУ¬Ö»ÒªÄÃÆðÁ˵¶£¬¾ÍÊÇÒ»³¡ÎÞÑĵÄÃΡ£
¡ù À´Ô´:¡¤BBS ˮľÇ廪վ bbs.net.tsinghua.edu.cn¡¤[FROM: 159.226.21.168]
BBSˮľÇ廪վ¡Ã¾«»ªÇø