在非英文linux系统上进行软件安装或配置时候,相信大家或多或少的都会遇到locale name not valid或warning:setlocale: LC_CTYPE: cannot change locale的错误信息吧。我也常遇到类似的问题,最近的一个例子就是在非英文Linux环境安装AUT的agent后,无法正常启动。Error log不断提示localhost:locale::facet::_S_create_c_locale name not valid。
说到这里,就先接单介绍下LC吧,它是Linux系统中多语言环境的设置接口,按照所涉及文化的各个方面分成12大类,分别是:
1. LC_CTYPE
用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。
2. LC_NUMERIC
设置非货币数字的显示格式。
3. LC_COLLATE
指定该环境的排序和比较规则。
4. LC_TIME
定义系统时间和日期格式。
5. LC_MONETARY
规定货币符号格式。
6. (LC_MESSAGES)
提示信息包括错误,状态,标题,标签,按钮和菜单等。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,一旦LANGUAGE参数进行了设置,则LC_MESSAGES参数就会失效。
7. LC_NAME
姓名的展示方式。
8. LC_ADDRESS
地址的展示方式。
9. LC_TELEPHONE
电话号码的展示方式。
10. LC_MEASUREMENT
度量衡的展示方式 。
11. LC_PAPER
默认纸张尺寸大小。
12. LC_IDENTIFICATION
对locale自身包含信息的概述。
除此之外,还有两个变量
· LANG
LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。
· LC_ALL
这是一个宏,如果设置了该值,则所有LC_*变量的值都会被覆盖。但需要注意的是LANG的值不受该宏影响。
它们之间的优先级关系是这样的,LC_ALL> LC_* >LANG。
回到该问题本身,Dev fix bug的示意代码如下,相当的简洁高效,不是么?直接set LC_ALL的值为C。
int main(int argc, char* argv[] ){ // any LC_*variable set to invalid value (for ex: LC_CTYPE=SJDH) it will // throw exception,so setting environment variable LC_ALL=C, will PRevent // thowingexception in such cases. setenv("LC_ALL", "C", 1); enum CMD { NONE,CONSOLE, DAEMON } cmd = NONE; struct AgentCMD{ const char*command; CMD cmd;}那么LC_ALL=C(POSIX)又意味着什么呢?说白了,就是程序会去除所有locale sensitive的设置,以保证命令能正确执行。然后呢?修改之后agent能正常启动了么?这个自然啦,修改后的程序跟国际化还有什么关系么?又何谈国际化问题呢?说好的国际化回归测试,窃以为,亦可以休矣!大家也都同意么?
新闻热点
疑难解答