VS2010中wmain入口函数中使用wprintf输出中文乱码问题

来源:互联网 发布:cf淘宝 编辑:程序博客网 时间:2024/05/20 07:35

正确代码:

#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语言字符串参考

Primary
language
Sublanguage
Language stringChineseChinese"chinese"ChineseChinese (simplified)"chinese-simplified" or "chs"ChineseChinese (traditional)"chinese-traditional" or "cht"CzechCzech"csy" or "czech"DanishDanish"dan" or "danish"DutchDutch (default)"dutch" or "nld"DutchDutch (Belgian)"belgian", "dutch-belgian", or "nlb"EnglishEnglish (default)"english"EnglishEnglish (Australian)"australian", "ena", or "english-aus"EnglishEnglish (Canadian)"canadian", "enc", or "english-can"EnglishEnglish (New Zealand)"english-nz" or "enz"EnglishEnglish (United Kingdom)"eng", "english-uk", or "uk"EnglishEnglish (United States)"american", "american english", "american-english", "english-american", "english-us", "english-usa", "enu", "us", or "usa"FinnishFinnish"fin" or "finnish"FrenchFrench (default)"fra" or "french"FrenchFrench (Belgian)"frb" or "french-belgian"FrenchFrench (Canadian)"frc" or "french-canadian"FrenchFrench (Swiss)"french-swiss" or "frs"GermanGerman (default)"deu" or "german"GermanGerman (Austrian)"dea" or "german-austrian"GermanGerman (Swiss)"des", "german-swiss", or "swiss"GreekGreek"ell" or "greek"HungarianHungarian"hun" or "hungarian"IcelandicIcelandic"icelandic" or "isl"ItalianItalian (default)"ita" or "italian"ItalianItalian (Swiss)"italian-swiss" or "its"JapaneseJapanese"japanese" or "jpn"KoreanKorean"kor" or "korean"NorwegianNorwegian (default)"norwegian"NorwegianNorwegian (Bokmal)"nor" or "norwegian-bokmal"NorwegianNorwegian (Nynorsk)"non" or "norwegian-nynorsk"PolishPolish"plk" or "polish"PortuguesePortuguese (default)"portuguese" or "ptg"PortuguesePortuguese (Brazilian)"portuguese-brazil" or "ptb"RussianRussian (default)"rus" or "russian"SlovakSlovak"sky" or "slovak"SpanishSpanish (default)"esp" or "spanish"SpanishSpanish (Mexican)"esm" or "spanish-mexican"SpanishSpanish (Modern)"esn" or "spanish-modern"SwedishSwedish"sve" or "swedish"TurkishTurkish"trk" or "turkish"

 

setlocale国家字符串参考

Country/RegionCountry/Region stringAustralia"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"


0 0
原创粉丝点击