區域設置

區域設置（locale），也稱作“本地化策略集”、“本地環境”，是表達程序用戶地區方面的軟件設定。不同系統、平臺、與軟件有不同的區域設置處理方式和不同的設定範圍，但是一般區域設置最少也會包括語言和地區。操作系統的區域設置通常比較複雜。區域設置的內容包括：數據格式、貨幣金額格式、小數點符號、千分位符號、度量衡單位、通貨符號、日期寫法、日曆類型、文字排序、姓名格式、地址等等。
區域設置的主要目標是讓用戶選擇最適合他自己的設定。比如用以上的Windows作比喻：在控制面板的區域和語言選擇中，用戶可以選擇自己的字符集排序方法；當瀏覽文件時，系統會使用「用戶選擇的排序」來排列文件。

**實際落實**
計算機中一套定義用戶的語言、國家和用於定義用戶希望在其用戶界面上看到的各種可以改變的選擇的參數集合。通常一個區域設置標識符至少包括一個語言標識符和一個區域標識符。
在UNIX和Windows中，區域設置的控制是不同的。在UNIX下，通常通過環境變量來控制區域設置。這些環境變量包括：LC_ALL, LC_CTYPE, LC_TIME, 等等。你可以通過改變這些環境變量來控制你的程序或者命令所表現出來的區域設置，前提是這些程序或者命令必須是已經被國際化的和本地化的。在Windows下，你可以通過改變控制面板上的“語言/區域”中的區域的值來設定Windows的當前用戶的區域設置。

**Ubuntu操作系統**
在Ubuntu操作系統中，使用man locale-gen或man locale可獲得關於locale實現的細節。實際上是由glibc庫實現的。
locale相關（環境）變量生效的優先順序：
#LANGUAGE 指定個人對語言環境值的主次偏好，例如zh_CN:en_US:en
#LC_ALL 這不是一個環境變量，是一個可被C語言庫函數setlocale設置的宏，其值可覆蓋所有其他的locale設定。因此缺省時此值為空
#LC_xxx 可設定locale各方面（category）的值，可以覆蓋LANG的值。
#LANG 指定默認使用的locale值
可以把上述環境變量設在/etc/profile 或 /etc/environment等系統初始文件中。值得注意的是，若LANG或LC_ALL被設定為 "C"，那麼LANGUAGE的值將被忽視。 
除 C 和 POSIX這兩個locale名稱外，locale的名稱並未標準化。Linux平臺與Windows系統的locale名稱有很大不同。Linux名稱的命名規則為：
language_territory.codeset@modifier
其中language是ISO 639-1標準中定義的雙字母的語言代碼，territory是ISO 3166-1標準中定義的雙字母的國家和地區代碼，codeset是字符集的名稱 (如 UTF-8等)，而 modifier 則是某些 locale 變體的修正符。
bash中的使用示例：
$ 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
相關係統文件：
*在文件/usr/share/i18n/SUPPORTED中，列出了當前系統支持的所有locale與字符集的名字。
*在目錄/var/lib/locales/supported.d/下，列出了當前系統已經生成的所有locale的名字。 
*在文件/var/lib/locales/supported.d/local中，列出了所有想要生成或已經生成的locale的名字
*在目錄/usr/lib/locale//LC_*，用locale-gen編譯出的locale文件
*在文件/usr/lib/locale/locale-archive中，包含了很多本地已經生成的locale的具體內容，因此這個文件往往很大。使用命令localedef管理這一文件。使用locale-gen命令編譯出來的locale內容默認寫入該文件中。
*在文件/etc/default/locale中，可以手動配置locale環境變量，LC_CTYPE之類
*在目錄/usr/share/i18n/charmaps下，缺省的charmap存放路徑
*在目錄/usr/share/i18n/locales下，缺省的locale source file存放路徑
相關係統命令：
*locale 列出當前採用的各項本地策略，這些由LC_*環境變量定義
*locale charmap 列出系統當前使用的字符集
*locale -a  列出系統中已經安裝的所有locale
*locale -m  列出系統中已經安裝的所有charmap
*locale-gen --purge  將/usr/lib/locale/裡面的locale支持文件刪掉
*編輯文件/var/lib/locales/supported.d/local，增加需要的locale與字符集名字，如：
en_US.UTF-8 UTF-8
cs_CZ.UTF-8 UTF-8
cs_CZ.iso88592 iso88592
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB2312 GB2312
zh_CN.GB18030 GB18030
保存並關閉此文件。運行sudo dpkg-reconfigure --force locales，則重新生成字符集。
*或者使用命令sudo locale-gen en_US.UTF-8，生成制定的locale  en_US.UTF-8，並把這個locale名字加入文件/var/lib/locales/supported.d/local中
*或者使用命令sudo locale-gen，生成所有列在文件/var/lib/locales/supported.d/local中的locale
*或者
cd /usr/share/locales
sudo ./install-language-pack zh_CN
也可以安裝zh_CN的相關語言包。
*或者使用命令localedef -f UTF-8 -i zh_CN zh_CN.UTF8，從字符映射文件UTF-8，locale源文件zh_CN，編譯出locale稱為zh_CN.UTF8，存放入文件/usr/lib/locale/locale-archive中
*使用命令localedef --list-archive，列出文件/usr/lib/locale/locale-archive中所有可用的locale的名字
*sudo apt-get install language-selector language-env language-pack-zh-hans language-pack-zh-hant 安裝中文語言包
*sudo nano /etc/default/locale  修改該文件內容。

**Windows操作系統**
Windows SDK規定，“語言”是與溝通有關的一組屬性的集合，包括所有允許的字符、通貨符號、日期時間格式等等。每個“語言”有一個語言名字與語言標識符。語言往往還需要指出國家/地區，如“英語（美國）”使用的語言名字是“en-US”。
每個區域設置（locale）是一個“語言”及一個排序規則。Windows XP支持超過150個區域設置（locale）；Windows Vista支持超過200個區域設置（locale）;Windows 7支持至少365個區域設置（locale）。每個區域設置（locale）有區域設置名字(Locale Name )與區域設置標識符(Locale ID ,LCID )。例如："de-DE_phoneb"是德國德語使用德式電話薄排序規則（該排序規則與拉丁字母序稍有不同）。
「區域標識符」(Locale ID ,LCID )為32位的值，在程序設計中經常用到。LCID構成為：
+-------------+---------+-------------------------+-------------------------+

+-------------+---------+-------------------------+-------------------------+
31         20 19     16 15                    10  9                         0   bit
LCID的低10位是主語言（primary language）的ID；高6位指定次語言（sublanguage）。LCID的低16位稱為語言標識符（language identifier），數據類型名為LANGID。例如，中文作為主語言，編號是0x04。作為次語言的臺灣中文的編號是0x01；簡體中文的編號是0x02，香港中文是0x03，新加坡中文是0x04，澳門中文是0x05。因此，“中國大陸簡體中文”的區域標識符等於次語言的標識0x02左移10位，再加上主語言的標識0x04，即(0x02