`
mybwu_com
  • 浏览: 178227 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

 
阅读更多

正确代码:

#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 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"


分享到:
评论

相关推荐

    嵌入式 深入浅出学习驱动开发

    中,入口函数是 main()/WinMain()和 Unicode的 wmain()/wWinmain(),DLL的入口函 数则可有可无,它是 DllMain()。驱动程序也有入口函数,而且是必须的,它是 DriverEntry(),再次提示,它是必须的,因为 I/O管理器会...

    019-兼容型字符串(TCHAR)及相关函数.flv

    #define _tmain wmain #define _tWinMain wWinMain #else #define _tmain main #define _tWinMain WinMain #endif _T("字符串") L"字符串" _T和_L的区别在于,_L不管你是以什么方式编译,一律以...

    libwgetopt:getopt()的宽字符版本-开源

    该库提供了wgetopt()函数,它是标准Unix / POSIX getopt()函数的宽字符版本。 它适用于解析Windows特定的wmain()函数的宽字符参数。

    获取操作系统信息

    wmain( __in int argc, __in_ecount(argc) PCWSTR argv[] ) { UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); if (IsWindowsXPOrGreater()) { printf("XPOrGreater\n"); } if ...

    byenow:更快的文件夹删除器

    回头见这是byenow的源代码, byenow是Windows的多线程文件夹删除实用程序。 共享该代码是为了让任何有兴趣的人都能看到该程序的工作原理。... 要阅读代码,请从wmain_app() byenow.cpp ,然后从那里开始。

    Serial2Websocket:串行端口 &lt;-> websocket 隧道,将串行设备“直接”与浏览器连接

    自述文件 !!! 这个 repo 可以存在,因为它... g++ -o bin/Serial2Websocket S2WApp.cpp S2WMain.cpp SerialLink.cpp WebsocketLink.cpp `wx-config --cppflags` `wx-config --libs` -I &lt;path&gt; -L &lt;path&gt; -lboost_s

Global site tag (gtag.js) - Google Analytics