我们在进行控制台、文件读写等程序开发的时候,往往会遇到中文输入输出异常的问题。大部分的资料都告诉我们,要在输出之前通过调用setlocale函数来设置区域名称——将区域名称设为“chs”,代码如下:
::setlocale(LC_ALL, "chs");
也有这么写的:
::setlocale(LC_ALL, "chinese-simplified");
只告诉我们要这样做,也简单说了原因,但这个”chs“/"chinese-simplified"是从哪里来的呢?还有别的域名名称吗?大部分资料在这个地方就打住不说了。
为一探究竟,还是从MSDN查起吧。
很快,找到了线索:
The set of available languages, country/region codes, and code pages includes all those supported by the Win32 NLS API (except code pages that require more than two bytes per character, like UTF-8). The set of language and country/region codes supported by setlocale is listed in Language and Country/Region Strings.
很快,就看到了完整的Language Strings表格,完整摘录如下:
Primary language |
Sublanguage |
Language string |
---|
Chinese
|
Chinese
|
"chinese"
|
Chinese
|
Chinese (simplified)
|
"chinese-simplified" or "chs"
|
Chinese
|
Chinese (traditional)
|
"chinese-traditional" or "cht"
|
Czech
|
Czech
|
"csy" or "czech"
|
Danish
|
Danish
|
"dan" or "danish"
|
Dutch
|
Dutch (default)
|
"dutch" or "nld"
|
Dutch
|
Dutch (Belgium)
|
"belgian", "dutch-belgian", or "nlb"
|
English
|
English (default)
|
"english"
|
English
|
English (Australia)
|
"australian", "ena", or "english-aus"
|
English
|
English (Canada)
|
"canadian", "enc", or "english-can"
|
English
|
English (New Zealand)
|
"english-nz" or "enz"
|
English
|
English (United Kingdom)
|
"eng", "english-uk", or "uk"
|
English
|
English (United States)
|
"american", "american english", "american-english", "english-american", "english-us", "english-usa", "enu", "us", or "usa"
|
Finnish
|
Finnish
|
"fin" or "finnish"
|
French
|
French (default)
|
"fra" or "french"
|
French
|
French (Belgium)
|
"frb" or "french-belgian"
|
French
|
French (Canada)
|
"frc" or "french-canadian"
|
French
|
French (Switzerland)
|
"french-swiss" or "frs"
|
German
|
German (default)
|
"deu" or "german"
|
German
|
German (Austria)
|
"dea" or "german-austrian"
|
German
|
German (Switzerland)
|
"des", "german-swiss", or "swiss"
|
Greek
|
Greek
|
"ell" or "greek"
|
Hungarian
|
Hungarian
|
"hun" or "hungarian"
|
Icelandic
|
Icelandic
|
"icelandic" or "isl"
|
Italian
|
Italian (default)
|
"ita" or "italian"
|
Italian
|
Italian (Switzerland)
|
"italian-swiss" or "its"
|
Japanese
|
Japanese
|
"japanese" or "jpn"
|
Korean
|
Korean
|
"kor" or "korean"
|
Norwegian
|
Norwegian (default)
|
"norwegian"
|
Norwegian
|
Norwegian (Bokmal)
|
"nor" or "norwegian-bokmal"
|
Norwegian
|
Norwegian (Nynorsk)
|
"non" or "norwegian-nynorsk"
|
Polish
|
Polish
|
"plk" or "polish"
|
Portuguese
|
Portuguese (default)
|
"portuguese" or "ptg"
|
Portuguese
|
Portuguese (Brazil)
|
"portuguese-brazilian" or "ptb"
|
Russian
|
Russian (default)
|
"rus" or "russian"
|
Slovak
|
Slovak
|
"sky" or "slovak"
|
Spanish
|
Spanish (default)
|
"esp" or "spanish"
|
Spanish
|
Spanish (Mexico)
|
"esm" or "spanish-mexican"
|
Spanish
|
Spanish (Modern)
|
"esn" or "spanish-modern"
|
Swedish
|
Swedish
|
"sve" or "swedish"
|
Turkish
|
Turkish
|
"trk" or "turkish"
|
完整表格可以“Language Strings”为关键字在MSDN中查询浏览。
从上面这个表格的最后一列,也就是Laguage String列,终于看到熟悉的字符串了。不难理解,所有的区域名称代码都出自这张表格。而且,从过试验发现,”chs“和”CHS“都是可以的,也就是说,区域名称代码是不区分大小写的。
值得注意的是,还可以通过如下的调用来获取当前操作系统的语言、国家(区域)和代码页(Code Page)
setlocale( LC_ALL, NULL );
例如:
English_United States.1252,一目了然。