正确代码:
#include "stdio.h" #include "Windows.h" #include <locale.h> 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语言字符串参考
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国家字符串参考
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" |
* SAR | "hkg", "*", 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" |
* | "twn" or "*" |
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" |