天天看點

setlocale(LC_ALL,"") 中的 LC_* 是什麼意思,以及 LANGUAGE/LANG 都是些啥?這些都是個啥?首先 setlocale(...) 是啥?LC_ALL,LE_* 又是個啥?那麼 LE_* 都包含啥?如何修改?

這些都是個啥?

上面提到的種種,實際上都是

區域

設定相關的東西,是以今天我們所提到的東西都和

區域

有關。

首先

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_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_*

都包含啥?

首先來看一些都有哪些需要設定的變量,通過在 linux 系統指令行中輸入

locale

就可以列印所有相關的環境變量以及對應的值。

一般會包括:

  1. LC_CTYPE

    – 語言符号及其分類
  2. LC_NUMERIC

    – 數字
  3. LC_COLLATE

    – 比較和排序習慣
  4. LC_TIME

    – 時間顯示格式
  5. LC_MONETARY

    – 貨币機關
  6. LC_MESSAGES

    – 資訊主要是提示資訊,錯誤資訊,狀态資訊,标題,标簽,按鈕和菜單等
  7. LC_NAME

    – 姓名書寫方式
  8. LC_ADDRESS

    – 位址書寫方式
  9. LC_TELEPHONE

    – 電話号碼書寫方式
  10. LC_MEASUREMENT

    – 度量衡表達方式
  11. LC_PAPER

    – 預設紙張尺寸大小
  12. LC_IDENTIFICATION

    – 對locale自身包含資訊的概述

一般認為由于區域和語言導緻的不同習慣大緻就是這12類。但是你從 linux 系統指令中輸入

locale

擷取到的結果可能不止這12個,還有

LANG

LANGUAGE

LC_ALL

,那是這三個比較特殊。

  1. LANG

    – 是一個預設值,所有沒有顯式設定值的

    LC_*

    變量都會取

    LANG

    的值。
  2. LANGUAGE

    – 的優先級比較高,會覆寫所有設定過的

    LC_*

    的值
  3. LC_ALL

    – 并不是一個環境變量,而是一個

    glibc

    中定義的一個宏,實際上則是調用了

    setlocale

    把所有的

    LC_*

    的變量設定了一遍

如何修改?

在程式中通過調用

setlocale(...)

來進行修改。

linux 中可以通過下面幾種方式來修改:

  1. 建立或編輯

    /etc/locale.conf

    對系統級進行設定
  2. 建立或編輯

    ~/.config/locale.conf

    對目前使用者進行設定
  3. 在終端執行

    export LC_TIME=xxxx

    對目前終端進行設定
  4. 通過

    localectl

    指令來修改,比如

    localectl set-locale LANG=en_US.utf8

使用locale -a可以列出本機目前可以使用的值。locale -av還可以具體檢視這些值更詳細的資訊。

  

變量生效的優先順序從高到低如下:

  1. LANGUAGE

    優先級最高,指定個人對語言環境值的主次偏好,例如

    zh_CN:en_US:en

    ,冒号分隔的是多種選擇。
  2. LC_ALL

    設定的值
  3. LC_*

    可設定

    locale

    各方面的值,可以覆寫

    LANG

    的值。
  4. LANG

    指定預設使用的locale值

繼續閱讀