什么是Locale?
 
Locale是指特定于某个国家或地区的一组设定,包括字符集,数字、货币、时间和日期的格式等。由于国家和本地习惯的不同,在处理文字、日期、数字、货币格式等问题都会有所不同,locale就是用来解决这个问题。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境,包括语言(Language), 地域 (Territory) 和字符集(Codeset)。在Windows中,每个Locale可以用一个32位数字表示,记作LCID。系统Locale决定代码页,用户Locale决定数字、货币、时间和日期的格式。
 
中文(中国) 2052   :0804
中文(台湾) 1028   :0404
美国英语     1033   :0409
     1042   :0412
日语         1041   :0411
 
 
什么是代码页?
 
就是各国的文字编码和Unicode之间的映射表。
由于不同 ANSI 编码所规定的标准是不相同的,因此,对于一个给定的多字节字符串,我们必须知道它采用的是哪一种编码规则,才能够知道它包含了哪些字符。而对于 UNICODE 字符串来说,不管在什么环境下,它所代表的字符内容总是不变的。
在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode 编码。可以在“语言与区域设置”中选择一个代码页作为非 Unicode 编码所采用的默认编码方式,如936为简体中文GBK950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前上无法做到这一点。
Unicode程序的运行与当前的ANSI代码页没有关系。MBCS程序的运行依赖于ANSI代码页。如果设计者和使用者使用不同的代码页,就可能出现乱码。微软开发的程序大都是Unicode程序,不管我们怎样变换系统Locale,它们总能正常运行。
      每个Locale可以对应一个ANSI代码页和一个OEM代码页。Win32 API使用ANSI代码页,底层设备使用OEM代码页,两者可以相互映射。
 
Code Pages Supported by Windows

SBCS (Single Byte Character Set) Codepages