區域設定，也稱作 本地化策略集、本地環境，是表達程式使用者地區方面的軟體設定。不同系統、平臺、與軟體有不同的區域設定處理方式和不同的設定範圍，但是一般區域設定最少也會包括語言和地區。作業系統的區域設定通常比較複雜。區域設定的內容包括：資料格式、貨幣金額格式、小數點符號、千分位符號、度量衡單位、通貨符號、日期寫法、日曆型別、文字排序、姓名格式、地址等等。 區域設定的主要目標是讓使用者選擇最適合他自己的設定。比如用以上的 Windows 作比喻：在控制面板的區域和語言選擇中，使用者可以選擇自己的字元集排序方法；當瀏覽檔案時，系統會使用「使用者選擇的排序」來排列檔案。 實際落實 計算機中一套定義使用者的語言、國家和用於定義使用者希望在其使用者介面上看到的各種可以改變的選擇的引數集合。通常一個區域設定識別符號至少包括一個語言識別符號和一個區域識別符號。 在 UNIX 和 Windows 中，區域設定的控制是不同的。在 UNIX 下，通常透過環境變數來控制區域設定。這些環境變數包括：LC_ALL LC_CTYPE LC_TIME 等等。你可以透過改變這些環境變數來控制你的程式或者命令所表現出來的區域設定，前提是這些程式或者命令必須是已經被國際化的和本地化的。在 Windows 下，你可以透過改變控制面板上的 語言 區域 中的區域的值來設定 Windows 的當前使用者的區域設定。 Ubuntu 作業系統 在 Ubuntu 作業系統中，使用 man localegen 或 man locale 可獲得關於 locale 實現的細節。實際上是由 glibc 庫實現的。 locale 相關（環境）變數生效的優先順序： LANGUAGE 指定個人對語言環境值的主次偏好，例如 zh_CNen_USen LC_ALL 這不是一個環境變數，是一個可被 C 語言庫函式 setlocale 設定的宏，其值可覆蓋所有其他的 locale 設定。因此預設時此值為空 LC_xxx 可設定 locale 各方面（category）的值，可以覆蓋 LANG 的值。 LANG 指定預設使用的 locale 值 可以把上述環境變數設在 etcprofile 或 etcenvironment 等系統初始檔案中。值得注意的是，若 LANG 或 LC_ALL 被設定為 C，那麼 LANGUAGE 的值將被忽視。 除 C 和 POSIX 這兩個 locale 名稱外，locale 的名稱並未標準化。Linux 平臺與 Windows 系統的 locale 名稱有很大不同。Linux 名稱的命名規則為： language _territory codesetmodifier 其中 language 是 ISO 6391 標準中定義的雙字母的語言程式碼，territory 是 ISO 31661 標準中定義的雙字母的國家和地區程式碼，codeset 是字元集的名稱 如 UTF8 等，而 modifier 則是某些 locale 變體的修正符。 bash 中的使用示例： LC_TIMEen_USUTF8 date Fri Oct 31 195116 CST 2014 LC_TIMEfi_FIUTF8 date pe 31102014 195200 0800 LC_TIMEzh_CNUTF8 date 2014 年 10 月 31 日 星期五 195307 CST 相關係統檔案： 在檔案 usrsharei18nSUPPORTED 中，列出了當前系統支援的所有 locale 與字元集的名字。 在目錄 varliblocalessupportedd 下，列出了當前系統已經生成的所有 locale 的名字。 在檔案 varliblocalessupporteddlocal 中，列出了所有想要生成或已經生成的 locale 的名字 在目錄 usrliblocalelocale_nameLC_，用 localegen 編譯出的 locale 檔案 在檔案 usrliblocalelocalearchive 中，包含了很多本地已經生成的 locale 的具體內容，因此這個檔案往往很大。使用命令 localedef 管理這一檔案。使用 localegen 命令編譯出來的 locale 內容預設寫入該檔案中。 在檔案 etcdefaultlocale 中，可以手動配置 locale 環境變數，LC_CTYPE 之類 在目錄 usrsharei18ncharmaps 下，預設的 charmap 存放路徑 在目錄 usrsharei18nlocales 下，預設的 locale source file 存放路徑 相關係統命令： locale 列出當前採用的各項本地策略，這些由 LC_ 環境變數定義 locale charmap 列出系統當前使用的字元集 locale a 列出系統中已經安裝的所有 locale locale m 列出系統中已經安裝的所有 charmap localegen purge 將 usrliblocale 裡面的 locale 支援檔案刪掉 編輯檔案 varliblocalessupporteddlocal，增加需要的 locale 與字元集名字，如： en_USUTF8 UTF8 cs_CZUTF8 UTF8 cs_CZiso88592 iso88592 zh_CNUTF8 UTF8 zh_CNGBK GBK zh_CNGB2312 GB2312 zh_CNGB18030 GB18030 儲存並關閉此檔案。執行 sudo dpkgreconfigure force locales，則重新生成字元集。 或者使用命令 sudo localegen en_USUTF8，生成制定的 locale en_USUTF8，並把這個 locale 名字加入檔案 varliblocalessupporteddlocal 中 或者使用命令 sudo localegen，生成所有列在檔案 varliblocalessupporteddlocal 中的 locale 或者 cd usrsharelocales sudo installlanguagepack zh_CN 也可以安裝 zh_CN 的相關語言包。 或者使用命令 localedef f UTF8 i zh_CN zh_CNUTF8，從字元對映檔案 UTF8，locale 原始檔 zh_CN，編譯出 locale 稱為 zh_CNUTF8，存放入檔案 usrliblocalelocalearchive 中 使用命令 localedef listarchive，列出檔案 usrliblocalelocalearchive 中所有可用的 locale 的名字 sudo aptget install languageselector languageenv languagepackzhhans languagepackzhhant 安裝中文語言包 sudo nano etcdefaultlocale 修改該檔案內容。 Windows 作業系統 Windows SDK 規定，語言 是與溝通有關的一組屬性的集合，包括所有允許的字元、通貨符號、日期時間格式等等。每個 語言 有一個語言名字與語言識別符號。語言往往還需要指出國家 地區，如 英語（美國） 使用的語言名字是 enUS。 每個區域設定（locale）是一個 語言 及一個排序規則。Windows XP 支援超過 150 個區域設定（locale）；Windows Vista 支援超過 200 個區域設定（locale）Windows 7 支援至少 365 個區域設定（locale）。每個區域設定（locale）有區域設定名字 Locale Name 與區域設定識別符號 Locale ID LCID。例如：deDE_phoneb 是德國德語使用德式電話薄排序規則（該排序規則與拉丁字母序稍有不同）。 「區域識別符號」Locale ID LCID 為 32 位的值，在程式設計中經常用到。LCID 構成為： Reserved Sort ID SubLanguage ID Primary Language ID 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，即 0x02100x042052，所以簡體中文的 LCID 是 2052。類似的，可以算出繁體中文的 LCID 是 1028。美國英語的 LCID 是 1033。使用 Windows 預定義宏，MAKELANGID LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED 的結果也是 2052。所有的語言 國家地區列表見：MSDNLanguage Identifier Constants and Strings 排序識別符號（Sort Order Identifier）佔 4 位，用於表示排序的方法。如簡體中文有 SORT_CHINESE_PRC（筆劃序）、SORT_CHINESE_PRCP（拼音序）。例如，使用筆劃序的簡體中文的 locale 名字為 zhCN_stroke。所有排序規則列表見：Sort Order Identifiers。 區域設定名字 Locale Name 的命名格式為： locale primaryLanguage ScriptSubLanguage _sortorder localename language _countryORregion CodePage CodePage C NULL 可理解為： primaryLanguage 是 ISO 6391 或 ISO 6392T 中定義的語言縮寫的小寫形式； Script 是 ISO 15924 定義的書寫系統的首字母大寫的 4 字母表示。例如，拉丁字母拼寫的烏茲別克語為 uzLatnUZ。 SubLanguage 是 ISO 31661 中定義的國家 地區二位字母程式碼的大寫形式；例如：zhCN_stroke 的值為 MAKELCID MAKELANGID LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED SORT_CHINESE_PRC，即 133124。 localename 形式是簡短的標準化字串，見表的 Language tag 欄目。a short IETFstandardized string for example enUS for English United States or bsCyrlBA for Bosnian Cyrillic Bosnia and Herzegovina These forms are preferred For a list of supported locale names by Windows operating system version see the Language tag column of the table in Appendix A Product Behavior in MSLCID Windows Language Code Identifier LCID Reference This resource lists the supported language script and region parts of the locale names For information about the supported locale names that have nondefault sort orders see the Locale name column in Sort Order Identifiers Under Windows 10 or later locale names that correspond to valid BCP47 language tags are allowed For example jpUS is a valid BCP47 tag but it is effectively only US for locale functionality 同一個區域設定（locale），可以有多種字元集編碼表示。例如，Windows 作業系統的簡體中文的預設編碼字元集（即內碼表）是 GBK，即 936 ANSIOEM Simplified Chinese GBK。而 Linux 作業系統統一使用 UTF8 字元集，所以 Linux 簡體中文的預設編碼字元集是 UTF8。所有內碼表列表見：Code Page Identifiers。如果需要指出使用的內碼表，在上述字串最後用 區隔，後跟 Windows 內碼表數字或者 ACP、OCP。例如：French_Canada1252。指定內碼表只適用於 LC_ALL 或 LC_CTYPE。 可以對當前預設的 locale 只指明內碼表，形如 code_page。使用使用者預設語言與國家地區設定，即來自 GetUserDefaultLocaleName 的結果。不建議採用此種方式，因為可能會產生不一致結果。 對於 C 標準庫函式 setlocale ，指定引數 locale 的基本格式為： Locale Name language _country_region code_page 上述 language 與 country_region 一般不用縮寫，詳細列表見 National Language Support NLS API Reference。例如，對與中文簡體，使用字串 chinese、chinesesimplified、chinese_CHN、chs，都能得到 Chinese Simplified_Peoples Republic of China936 效果。 作業系統有一個當前區域設定。使用者可以在控制面板的區域設定中改變它。每個區域設定有許多相關的資訊，程式設計時可以用 Locale information types 獲取這些值的資訊。作業系統賦予每個執行緒一個區域設定，初始值為 LOCALE_SYSTEM_DEFAULT 相關係統 API 函式： GetUserDefaultLCID 獲取當前使用者的預設 LCID。對於簡體中文作業系統返回值為 2052 GetUserDefaultLocaleName 獲取當前使用者的預設 locale 的名字。對於簡體中文作業系統該名字為 zhCN GetSystemDefaultLCID 獲取系統的預設 LCID。對於簡體中文作業系統返回值為 2052 GetSystemDefaultLocaleName 獲取系統預設 locale 的名字 GetThreadLocale 獲取當前執行緒的 LCID SetThreadLocale 設定當前執行緒的 LCID。 IsValidLocaleName 判斷一個字串是否為當前作業系統支援的 locale 的名字 LocaleNameToLCID 從 locale 的名字獲取它的 LCID GetLocaleInfoEx 獲取指定 locale 的各方面的資訊 EnumSystemLocalesEx 列舉當前作業系統支援的所有的 locale 的名字 EnumCalendarInfoExEx 列舉指定 locale 的日曆資料。例如 zhTW 有兩個日曆型，分別為 格里曆（本地） 與 格里曆（英文）。 EnumDateInfoExEx 列舉指定 locale 的各種 calendar 的日期格式。 GetCalendarInfoEx 查詢指定 locale 指定日曆型的指定方面的資料。 GetDateFormatEx 把時間資料轉換為指定格式的日期字串。 GetTimeFormatEx 把時間資料轉換為指定格式的時間字串。 GetDurationFormatEx 把一段持續時間的資料轉換為指定格式的字串。 EnumSystemLanguageGroups 同一語言組可能共享鍵盤佈局、輸入法、TT 字型、內碼表翻譯表等等。 GetSystemDefaultLangID 系統預設的非 Unicode 語言 GetKeyboardLayout 當前程序的輸入法 GetSystemDefaultUILanguage 選單、對話方塊、Windows 訊息、INF 檔案、幫助檔案等的預設語言 GetSystemPreferredUILanguages 作業系統使用的選單、對話方塊、Windows 訊息、INF 檔案、幫助檔案等的語言 GetUserDefaultUILanguage 使用者使用的選單、對話方塊、Windows 訊息、幫助檔案等的語言 GetUserPreferredUILanguages 使用者使用的選單、對話方塊、Windows 訊息、幫助檔案等的語言集合 GetThreadPreferredUILanguages 當前執行緒使用的 UI 語言集合 列表 區域描述 簡寫 十六進位制值 十進位制值 南非荷蘭語 af 0x0436 1078 南非荷蘭語（南非） afZA 阿姆哈拉語 am 阿姆哈拉語（衣索比亞） amET 阿爾巴尼亞語 sq 0x041C 1052 阿拉伯語 ar 阿拉伯語 阿拉伯聯合大公國 arAE 0x3801 14337 阿拉伯語 巴林 arBH 0x3C01 15361 阿拉伯語 阿爾及利亞 arDZ 0x1401 5121 阿拉伯語 埃及 arEG 0x0C01 3073 阿拉伯語 伊拉克 arIQ 0x0801 2049 阿拉伯語 約旦 arJO 0x2C01 11265 阿拉伯語 科威特 arKW 0x3401 13313 阿拉伯語 黎巴嫩 arLB 0x3001 12289 阿拉伯語 利比亞 arLY 0x1001 4097 阿拉伯語 摩洛哥 arMA 0x1801 6145 馬普切語 arn 馬普切語（智利） arnCL 阿拉伯語 阿曼 arOM 0x2001 8193 阿拉伯語 卡達 arQA 0x4001 16385 阿拉伯語 沙烏地阿拉伯 arSA 0x0401 1025 阿拉伯語 敘利亞 arSY 0x2801 10241 阿拉伯語 突尼西亞 arTN 0x1C01 7169 阿拉伯語 葉門 arYE 0x2401 9217 阿薩姆語 as 阿薩姆語 印度 asIN 亞美尼亞語 hy 0x042B 1067 亞塞拜然語 az 亞塞拜然語 拉丁文 azLatn 0x042C 1068 亞塞拜然語 西里爾文 azCyrl 0x082C 2092 亞塞拜然語 拉丁文 亞塞拜然 azLatnAZ 0x042C 1068 亞塞拜然語 西里爾文 亞塞拜然 azCyrlAZ 0x082C 2092 巴什基爾語 ba 巴什基爾語 俄羅斯 baRU 巴斯克語 eu 0x042D 1069 白俄羅斯語 be 0x0423 1059 白俄羅斯語 白俄羅斯 beBY 保加利亞語 bg 0x0402 1026 保加利亞語 保加利亞 bgBG 孟加拉語 bn 孟加拉語 孟加拉 bgBD 孟加拉語 印度 bgIN 藏語 bo 藏語 中國 boCN 布列塔尼語 bo 布列塔尼語 法國 brFR 波斯尼亞語 bs 波斯尼亞語（西里爾文） bsCyrl 波斯尼亞語（西里爾文，波斯尼亞和黑塞哥維那） bsCyrlBA 波斯尼亞語（拉丁文） bsLatn 波斯尼亞語（拉丁文，波斯尼亞和黑塞哥維那） bsLatnBA 加泰隆語 ca 0x0403 1027 加泰羅尼亞語（西班牙） caES 0x0403 1027 中文 zh 中文 中國大陸 拼音排序 zhCN 0x0804 2052 中文 中國大陸 筆畫排序 zhCN_stroke 0x20804 中文（簡體） zhHans 0x0004 中文（繁體） zhHant 0x7C04 中文 香港特別行政區 zhHK 0x0C04 3076 中文 香港特別行政區部首筆畫序 zhHK_radstr 0x0C04 3076 中文 澳門特別行政區 zhMO 0x1404 5124 中文 澳門特別行政區部首筆畫序 zhMO_radstr 0x1404 5124 中文 澳門特別行政區筆畫序 zhMO_stroke 0x1404 5124 中文 新加坡 zhSG 0x1004 4100 中文 新加坡筆畫序 zhSG_stroke 0x1004 4100 中文 臺灣 zhTW 0x0404 1028 中文 臺灣 Bopomofo 排序 zhTW 0x30404 中文 臺灣拼音序 zhTW_pronun 0x0404 1028 中文 臺灣部首筆畫序 zhTW_radstr 0x0404 1028 克羅埃西亞語 hr 0x041A 1050 科西嘉語 co 科西嘉語（法國） coFR 捷克語 cs 0x0405 1029 捷克語（捷克共和國） csCZ 威爾士語 cy 威爾士語（英國） cyGB 丹麥語 da 0x0406 1030 丹麥語（丹麥） daDK 1030 荷蘭語 荷蘭 nlnl 0x0413 1043 荷蘭語 比利時 nlbe 0x0813 2067 英語 加勒比 en029 英語 澳大利亞 enAU 0x0C09 3081 英語 貝里斯 enBZ 0x2809 10249 英語 加拿大 enCA 0x1009 4105 英語 加勒比 enCB 0x2409 9225 英語 印度 enIN 0x4009 16393 英語 愛爾蘭 enIE 0x1809 6153 英語 牙買加 enJM 0x2009 8201 英語 馬來西亞 enMY 0x4409 17417 英語 紐西蘭 enNZ 0x1409 5129 英語 菲律賓 enPH 0x3409 13321 英語 新加坡 enSG 0x4809 18441 英語 南非 enZA 0x1C09 7177 英語 特立尼達島 enTT 0x2C09 11273 英語 英國 enGB 0x0809 2057 英語 美國 enUS 0x0409 1033 英語 辛巴威 enZW 0x3009 12297 愛沙尼亞語 et 0x0425 1061 波斯語 fa 0x0429 1065 芬蘭語 fi 0x040B 1035 法羅語 fo 0x0438 1080 法語 法國 frfr 0x040C 1036 法語 比利時 frbe 0x080C 2060 法語 加拿大 frca 0x0C0C 3084 法語 盧森堡 frlu 0x140C 5132 法語 瑞士 frch 0x100C 4108 蓋爾語 愛爾蘭 gdie 0x083C 2108 蓋爾語 蘇格蘭 gd 0x043C 1084 德語 德國 Dictionary 排序 deDE 0x0407 1031 德語 德國 Phone book 排序 deDE_phoneb 0x10407 德語 奧地利 deAT 0x0C07 3079 德語 列支敦斯登 deLI 0x1407 5127 德語 盧森堡 deLU 0x1007 4103 德語 瑞士 deCH 0x0807 2055 下索布語 dsb 下索布語 德語 dsb_DE 迪維西語 dv 迪維西語 馬爾地夫 dv_MF 希臘語 el 0x0408 1032 希臘語 希臘 elGR 0x0408 1032 希伯來語 he 0x040D 1037 印地語 hi 0x0439 1081 匈牙利語 hu 0x040E 1038 冰島語 is 0x040F 1039 印度尼西亞語 id 0x0421 1057 義大利語 義大利 itit 0x0410 1040 義大利語 瑞士 itch 0x0810 2064 日語 ja 0x0411 1041 朝鮮語 ko 0x0412 1042 拉脫維亞語 lv 0x0426 1062 立陶宛語 lt 0x0427 1063 馬其頓 mk 0x042F 1071 馬來語 馬來西亞 msmy 0x043E 1086 馬來語 汶萊 msbn 0x083E 2110 馬耳他語 mt 0x043A 1082 馬拉地語 mr 0x044E 1102 挪威 伯克梅爾 nbno 0x0414 1044 挪威 尼諾斯克語 nnno 0x0814 2068 波蘭語 pl 0x0415 1045 葡萄牙語 葡萄牙 ptpt 0x0816 2070 葡萄牙語 巴西 ptbr 0x0416 1046 羅曼什語 rm 0x0417 1047 羅馬尼亞語 羅馬尼亞 ro 0x0418 1048 羅馬尼亞語 摩爾多瓦共和國 romo 0x0818 2072 俄語 ru 0x0419 1049 俄羅斯 摩爾多瓦共和國 rumo 0x0819 2073 梵文 sa 0x044F 1103 塞爾維亞語 西裡爾字母 srsp 0x0C1A 3098 塞爾維亞語 拉丁文 srsp 0x081A 2074 茨瓦納語 tn 0x0432 1074 斯洛維尼亞語 sl 0x0424 1060 斯洛伐克語 sk 0x041B 1051 索布語 sb 0x042E 1070 西班牙語 西班牙 現代 eses 0x0C0A 3082 西班牙語 西班牙 傳統 0x040A 1034 西班牙語 阿根廷 esar 0x2C0A 11274 西班牙語 玻利維亞 esbo 0x400A 16394 西班牙語 智利 escl 0x340A 13322 西班牙語 哥倫比亞 esco 0x240A 9226 西班牙語 哥斯大黎加 escr 0x140A 5130 西班牙語 多明尼加共和國 esdo 0x1C0A 7178 西班牙語 厄瓜多 esec 0x300A 12298 西班牙語 瓜地馬拉 esgt 0x100A 4106 西班牙語 宏都拉斯 eshn 0x480A 18442 西班牙語 墨西哥 esmx 0x080A 2058 西班牙語 尼加拉瓜 esni 0x4C0A 19466 西班牙語 巴拿馬 espa 0x180A 6154 西班牙 秘魯 espe 0x280A 10250 西班牙語 波多黎各 espr 0x500A 20490 西班牙語 巴拉圭 espy 0x3C0A 15370 西班牙語 薩爾瓦多 essv 0x440A 17418 西班牙語 烏拉圭 esuy 0x380A 14346 西班牙語 委內瑞拉 esve 0x200A 8202 南部索托語 st 0x0430 1072 斯瓦希里語 sw 0x0441 1089 瑞典語 瑞典 svse 0x041D 1053 瑞典語 芬蘭 svfi 0x081D 2077 泰米爾語 ta 0x0449 1097 韃靼語 tt 0X0444 1092 泰語 th 0x041E 1054 土耳其語 tr 0x041F 1055 特松加 ts 0x0431 1073 烏克蘭語 uk 0x0422 1058 烏都語 ur 0x0420 1056 烏茲別克語 西里爾文 uzuz 0x0843 2115 烏茲別克語 拉丁文 uzuz 0x0443 1091 越南語 vi 0x042A 1066 班圖語 xh 0x0434 1076 意第緒語 yi 0x043D 1085 祖魯語 zu 0x0435 1077 參見 國際化與本地化 iconv gettext 外部連結 微軟 MSDN 中的區域識別符號列表（英文） httpmsdnmicrosoftcomenuslibrary0h88fahhaspx httpswebarchiveorgweb20110925084131httpwwwchinauecomtoolvbshtmlvsmsclcidhtm 參考文獻 Category 計算機程式設計 Category 國際化與在地化