正确代码:
#include "stdio.h" #include "Windows.h" #include int wmain(int argc, wchar_t* argv[]) { setlocale(LC_ALL, "chs"); wprintf(L"%s\n", L"中文字符"); }其关键代码为:
setlocale(LC_ALL, "chs");配置地域化信息函数
为什么一定要调用setlocale呢? 因为在C/C++语言标准中定义了其运行时的字符集环境为"C",也就是ASCII字符集的一个子集,那么mbstowcs在工作时会将cstr中所包含的字符串看作是ASCII编码的字符,而不认为是一个包含有chs编码的字符串,所以他会将每一个中文拆成2个ASCII编码进行转换,这样得到的结果就是会形成4个wchar_t的字符组成的串,那么如何才能够让mbstowcs正常工作呢?在调用mbstowcs进行转换之间必须明确的告诉mbstowcs目前cstr串中包含的是chs编码的字符串,通过setlocale( LC_ALL, "chs" )函数调用来完成,需要注意的是这个函数会改变整个应用程序的字符集编码方式,必须要通过重新调用setlocale( LC_ALL, "C" )函数来还原,这样就可以保证mbstowcs在转换时将cstr中的串看作是中文串,并且转换成为2个wchar_t字符,而不是4个。
本地化设置需要具备三个条件:
-
a. 语言代码 (Language Code)b. 国家代码 (Country Code)c. 编码 (Encoding)
-
本地名字可以用下面这些部分来构造:语言代码 _国家代码 .编码 比如( zh_CN.UTF-8, en_US等)
locale的别名表见 /usr/lib/X11/locale/locale.alias(以Debian GNU/Linux为例)
setlocale语言字符串参考
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 (Belgian)
"belgian", "dutch-belgian", or "nlb"
English
English (default)
"english"
English
English (Australian)
"australian", "ena", or "english-aus"
English
English (Canadian)
"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 (Belgian)
"frb" or "french-belgian"
French
French (Canadian)
"frc" or "french-canadian"
French
French (Swiss)
"french-swiss" or "frs"
German
German (default)
"deu" or "german"
German
German (Austrian)
"dea" or "german-austrian"
German
German (Swiss)
"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 (Swiss)
"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 (Brazilian)
"portuguese-brazil" or "ptb"
Russian
Russian (default)
"rus" or "russian"
Slovak
Slovak
"sky" or "slovak"
Spanish
Spanish (default)
"esp" or "spanish"
Spanish
Spanish (Mexican)
"esm" or "spanish-mexican"
Spanish
Spanish (Modern)
"esn" or "spanish-modern"
Swedish
Swedish
"sve" or "swedish"
Turkish
Turkish
"trk" or "turkish"
setlocale国家字符串参考
Country/Region Country/Region string Australia "aus" or "australia" Austria "aut" or "austria" Belgium "bel" or "belgium" Brazil "bra" or "brazil" Canada "can" or "canada" China "china", "chn", "pr china", or "pr-china" Czech Republic "cze" or "czech" Denmark "dnk" or "denmark" Finland "fin" or "finland" France "fra" or "france" Germany "deu" or "germany" Greece "grc" or "greece" Hong Kong SAR "hkg", "hong kong", or "hong-kong" Hungary "hun" or "hungary" Iceland "iceland" or "isl" Ireland "irl" or "ireland" Italy "ita" or "italy" Japan "jpn" or "japan" Korea "kor" or "korea" Mexico "mex" or "mexico" The Netherlands "nld", "holland", or "netherlands" New Zealand "nzl", "new zealand", "new-zealand", or "nz" Norway "nor" or "norway" Poland "pol" or "poland" Portugal "prt" or "portugal" Russia "rus" or "russia" Singapore "sgp" or "singapore" Slovakia "svk" or "slovak" Spain "esp" or "spain" Sweden "swe" or "sweden" Switzerland "che" or "switzerland" Taiwan "twn" or "taiwan" Turkey "tur" or "turkey" United Kingdom "gbr", "britain", "england", "great britain", "uk", "united kingdom", or "united-kingdom" United States "usa", "america", "united states", "united-states", or "us"