linux setlocale用法
头文件与声明如下:
1 #include <locale.h>
2 char* setlocale(int category, const char* locale);
说明:
category:为locale分类,表达一种locale的领域方面,
通常有下面这些预定义常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME,
其中 LC_ALL 表示所有其它locale分类的并集。
locale:为期望设定的locale名称字符串,在Linux/Unix环境下,通常以下面格式表示locale名称:
language[_territory][.codeset][@modifier],
language 为 ISO 639 中规定的语言代码,territory 为 ISO 3166 中规定的国家/地区代码,codeset 为字符集名称。
在Linux下,可以使用 locale -a 命令查看系统中所有已配置的 locale。用不带选项的 locale 命令查看当前 Shell 中活动的 locale。
用 locale -m 命令查看locale系统支持的所有可用的字符集编码。
和locale相关的包叫做:locales,locale系统支持的所有可用locale在文件:/usr/share/i18n/SUPPORTED 中列出。
在Debian下,可用 dpkg-reconfigure locales 命令重新配置 locale,也可以手工修改 /etc/locale.gen 文件,然后运行 locale-gen 命令。
在Ubuntu下,修改 /var/lib/locales/supported.d/local 文件,配置新的 locale,然后运行 locale-gen 命令。
当 locale 为 NULL 时,函数只做取回当前 locale 操作,通过返回值传出,并不改变当前 locale。
当 locale 为 "" 时,根据环境的设置来设定 locale,检测顺序是:环境变量 LC_ALL,每个单独的locale分类LC_*,最后是 LANG 变量。
当C语言程序初始化时(刚进入到 main() 时),locale 被初始化为默认的 C locale,其采用的字符编码是所有本地 ANSI 字符集编码的公共部分,
是用来书写C语言源程序的最小字符集(所以才起locale名叫:C)。
当用 setlocale() 设置活动 locale 时,如果成功,会返回当前活动 locale 的全名称;如果失败,会返回 NULL。
为了使程序可以根据环境来改变活动 locale,一般都在程序的初始化阶段加入下面代码:setlocale(LC_ALL, ""),这样就可以根据环境变量来进行本地化操作.
bindtextdomain()
参考:man 3 bindtextdomain,功能是:设置包含 LC_MESSAGES 分类 (catalog) 的 locale 目录,
程序的 .mo 文件就保存到其下的目录中。LC_MESSAGES 是 locale 的一个分类 (catalog),和其它的分类,如:LC_TIME、LC_CTYPE,是平级的概念。
bindtextdomain() 有两个参数,
第一个叫 domainname,所谓 domain 即领域范围,它的含义是 .mo 文件将应用在哪个、哪些程序中,可以将 domain 对应为工程的概念,
上面的示例工程叫 GetTextTest,所以将 domainname 也定义为 "GetTextTest"。第二个参数是定义保存 .mo 文件的 locale 相关目录的路径,
可以为相对或绝对路径,示例中设置为 "locale/",表示检查当前目录下的 locale 目录.
domainname、locale 目录、程序当前活动 locale,这三者会决定你需要将 .mo 放到 locale 目录的具体位置,形式为:
[locale 目录]/[活动 locale]/LC_MESSAGES/[domainname].mo
比如,示例的 .mo 必需命名并保存为:
[GetTextTest 程序当前目录]/locale/zh_CN.GBK/LC_MESSAGES/GetTextTest.mo
textdomain()
参考:man 3 bindtextdomain,功能是:设置后来使用 gettext() 时的 domain。示例中设置:textdomain("GetTextTest")。
gettext()
参考:man 3 gettext, 功能是:替换程序中的 msgid 为 .mo 中的 msgstr,并返回 msgstr。示例中活动 locale 为 zh_CN.GBK 时,
gettext("Hello World!") 将返回文件 locale/zh_CN.GBK/LC_MESSAGES/GetTextTest.mo 中对应的 GBK 编码的 msgstr,即 "你好,世界!"
如果不存在 locale/zh_CN.GBK,则会到 locale/zh_CN 中查找 .mo。