這些都是個啥?
上面提到的種種,實際上都是
區域
設定相關的東西,是以今天我們所提到的東西都和
區域
有關。
首先 setlocale(...)
是啥?
setlocale(...)
setLocale(...)
是C庫中的一個設定地域化資訊的C函數。
函數原型為:
char *setlocale(int category, const char *locale)
參數解釋:
category
– 這是一個已命名的常量,指定了受區域設定影響的函數類别,可以設定為以下值。
LC_ALL // 包括下面的所有選項。
LC_COLLATE // 字元串比較。參見 strcoll()。
LC_CTYPE // 字元分類和轉換。例如 strtoupper()。
LC_MONETARY // 貨币格式,針對 localeconv()。
LC_NUMERIC // 小數點分隔符,針對 localeconv()。
LC_TIME // 日期和時間格式,針對 strftime()。
LC_MESSAGES // 系統響應。
locale
– 如果
locale
是
NULL
或空字元串
""
,則區域名稱将根據環境變量值來設定,其名稱與上述的類别名稱相同。
一般程式遇到編碼方面的問題,百度都會告訴你設定
setlocale(LC_ALL,"")
來解決,下面我們就了解一下這句代碼做了什麼.
LC_ALL,LE_*
又是個啥?
LC_ALL,LE_*
實際上
LC_ALL,LE_*
是
區域
相關的環境變量。簡而言之,
LC_COLLATE,LC_TYPE
等等都是環境變量。
很多程式的運作行為在全球不同的地域、語言環境中是不一樣的,例如Linux 中的
date
指令的行為就受
LC_TIME
的影響:
$ LC_TIME=en_US.UTF-8 date
Fri Oct 31 19:51:16 CST 2014
$ LC_TIME=fi_FI.UTF-8 date
pe 31.10.2014 19.52.00 +0800
$ LC_TIME=zh_CN.UTF-8 date
2014年 10月 31日 星期五 19:53:07 CST
是以自然需要一些環境變量來告訴計算機使用者所處的地區、語言等等,而
locale
是用來設定、查詢、管理這些變量的linux指令。
那麼 LE_*
都包含啥?
LE_*
首先來看一些都有哪些需要設定的變量,通過在 linux 系統指令行中輸入
locale
就可以列印所有相關的環境變量以及對應的值。
一般會包括:
-
– 語言符号及其分類LC_CTYPE
-
– 數字LC_NUMERIC
-
– 比較和排序習慣LC_COLLATE
-
– 時間顯示格式LC_TIME
-
– 貨币機關LC_MONETARY
-
– 資訊主要是提示資訊,錯誤資訊,狀态資訊,标題,标簽,按鈕和菜單等LC_MESSAGES
-
– 姓名書寫方式LC_NAME
-
– 位址書寫方式LC_ADDRESS
-
– 電話号碼書寫方式LC_TELEPHONE
-
– 度量衡表達方式LC_MEASUREMENT
-
– 預設紙張尺寸大小LC_PAPER
-
– 對locale自身包含資訊的概述LC_IDENTIFICATION
一般認為由于區域和語言導緻的不同習慣大緻就是這12類。但是你從 linux 系統指令中輸入
locale
擷取到的結果可能不止這12個,還有
LANG
,
LANGUAGE
和
LC_ALL
,那是這三個比較特殊。
-
– 是一個預設值,所有沒有顯式設定值的LANG
變量都會取LC_*
的值。LANG
-
– 的優先級比較高,會覆寫所有設定過的LANGUAGE
的值LC_*
-
– 并不是一個環境變量,而是一個LC_ALL
中定義的一個宏,實際上則是調用了glibc
把所有的setlocale
的變量設定了一遍LC_*
如何修改?
在程式中通過調用
setlocale(...)
來進行修改。
linux 中可以通過下面幾種方式來修改:
- 建立或編輯
對系統級進行設定/etc/locale.conf
- 建立或編輯
對目前使用者進行設定~/.config/locale.conf
- 在終端執行
對目前終端進行設定export LC_TIME=xxxx
- 通過
指令來修改,比如localectl
localectl set-locale LANG=en_US.utf8
使用locale -a可以列出本機目前可以使用的值。locale -av還可以具體檢視這些值更詳細的資訊。
變量生效的優先順序從高到低如下:
-
優先級最高,指定個人對語言環境值的主次偏好,例如LANGUAGE
,冒号分隔的是多種選擇。zh_CN:en_US:en
-
設定的值LC_ALL
-
可設定LC_*
各方面的值,可以覆寫locale
的值。LANG
-
指定預設使用的locale值LANG