当LC_ALL等于C以后

在非英文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能正常启动了么?这个自然啦,修改后的程序跟国际化还有什么关系么?又何谈国际化问题呢?说好的国际化回归测试,窃以为,亦可以休矣!大家也都同意么?

你可能感兴趣的:(C++)