在非英文linux系統(tǒng)上進行軟件安裝或配置時候,相信大家或多或少的都會遇到locale name not valid或warning:setlocale: LC_CTYPE: cannot change locale的錯誤信息吧。我也常遇到類似的問題,最近的一個例子就是在非英文Linux環(huán)境安裝AUT的agent后,無法正常啟動。Error log不斷提示localhost:locale::facet::_S_create_c_locale name not valid。
說到這里,就先接單介紹下LC吧,它是Linux系統(tǒng)中多語言環(huán)境的設置接口,按照所涉及文化的各個方面分成12大類,分別是:
1. LC_CTYPE
用于字符分類和字符串處理,控制所有字符的處理方式,包括字符編碼,字符是單字節(jié)還是多字節(jié),如何打印等。
2. LC_NUMERIC
設置非貨幣數字的顯示格式。
3. LC_COLLATE
指定該環(huán)境的排序和比較規(guī)則。
4. LC_TIME
定義系統(tǒng)時間和日期格式。
5. LC_MONETARY
規(guī)定貨幣符號格式。
6. (LC_MESSAGES)
提示信息包括錯誤,狀態(tài),標題,標簽,按鈕和菜單等。另外還有一個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的值不受該宏影響。
它們之間的優(yōu)先級關系是這樣的,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)又意味著什么呢?說白了,就是程序會去除所有l(wèi)ocale sensitive的設置,以保證命令能正確執(zhí)行。然后呢?修改之后agent能正常啟動了么?這個自然啦,修改后的程序跟國際化還有什么關系么?又何談國際化問題呢?說好的國際化回歸測試,竊以為,亦可以休矣!大家也都同意么?
新聞熱點
疑難解答