区域设置
实际落实 > 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构成为：
+-------------+---------+-------------------------+-------------------------+
|   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，即(0x02<<10)+0x04=2052，所以简体中文的LCID是2052。类似的，可以算出繁体中文的LCID是1028。美国英语的LCID是1033。使用Windows预定义宏，MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)的结果也是2052。所有的语言-国家地区列表见：MSDN:Language Identifier Constants and Strings（页面存档备份，存于）
排序标识符（Sort Order Identifier）占4位，用于表示排序的方法。如简体中文有SORT_CHINESE_PRC（笔划序）、SORT_CHINESE_PRCP（拼音序）。例如，使用笔划序的简体中文的locale名字为"zh-CN_stroke"。所有排序规则列表见：Sort Order Identifiers（页面存档备份，存于）。
区域设置名字(Locale Name )的命名格式为：
locale ::
    primaryLanguage[-Script][-SubLanguage[_sortorder]]
   | "locale-name"
   | "language[_countryORregion[.CodePage]]"
   | ".CodePage"
   | "C"
   | ""
   | NULL
可理解为：
primaryLanguage是ISO 639-1或ISO 639-2/T中定义的语言缩写的小写形式；
Script是ISO 15924定义的书写系统的首字母大写的4字母表示。例如，拉丁字母拼写的乌兹别克语为“uz-Latn-UZ”。
SubLanguage是ISO 3166-1中定义的国家/地区二位字母代码的大写形式；例如：zh-CN_stroke的值为MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC)，即133124。
locale-name形式是简短的标准化字符串，见表的Language tag栏目（页面存档备份，存于）。a short, IETF-standardized string; for example, en-US for English (United States) or bs-Cyrl-BA 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 [MS-LCID]: 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 non-default sort orders, see the Locale name column in Sort Order Identifiers. Under Windows 10 or later, locale names that correspond to valid BCP-47 language tags are allowed. For example, jp-US is a valid BCP-47 tag, but it is effectively only US for locale functionality.
同一个区域设置（locale），可以有多种字符集编码表示。例如，Windows操作系统的简体中文的默认编码字符集（即代码页）是GBK，即“936 (ANSI/OEM - Simplified Chinese GBK)”。而Linux操作系统统一使用UTF8字符集，所以Linux简体中文的默认编码字符集是UTF8。所有代码页列表见：Code Page Identifiers（页面存档备份，存于）。如果需要指出使用的代码页，在上述字符串最后用“.”区隔，后跟Windows代码页数字或者“ACP”、“OCP”。例如："French_Canada.1252"。指定代码页只适用于 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"、"chinese-simplified"、"chinese_CHN"、"chs"，都能得到"Chinese (Simplified)_People's Republic of China.936"效果。
操作系统有一个当前区域设置。用户可以在控制面板的区域设置中改变它。每个区域设置有许多相关的信息，编程时可以用Locale information types获取这些值的信息。操作系统赋予每个线程一个区域设置，初始值为LOCALE_SYSTEM_DEFAULT
相关系统API函数：
GetUserDefaultLCID 获取当前用户的缺省LCID。对于简体中文操作系统返回值为2052
GetUserDefaultLocaleName 获取当前用户的缺省locale的名字。对于简体中文操作系统该名字为zh-CN
GetSystemDefaultLCID 获取系统的缺省LCID。对于简体中文操作系统返回值为2052
GetSystemDefaultLocaleName 获取系统缺省locale的名字
GetThreadLocale() 获取当前线程的LCID
SetThreadLocale 设置当前线程的LCID。
IsValidLocaleName 判断一个字符串是否为当前操作系统支持的locale的名字
LocaleNameToLCID 从locale的名字获取它的LCID
GetLocaleInfoEx 获取指定locale的各方面的信息
EnumSystemLocalesEx 枚举当前操作系统支持的所有的locale的名字
EnumCalendarInfoExEx 枚举指定locale的日历数据。例如zh-TW有两个日历型，分别为“格里历（本地）”与“格里历（英文）”。
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语言集合