`
testcs_dn
  • 浏览: 113867 次
  • 性别: 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函数学习

    在编程世界中,主函数(Main Function)是每个C++程序的入口点,它标志着程序执行的开始。在标准C++中,主函数通常被声明为`int main()`,但有时候,我们可能需要主函数接收参数,这在特定场景下非常有用。本教程将...

    W32程序msvcrt如何回到main函数

    这里将环境变量指针、命令行参数指针以及参数个数压入栈中,然后通过`call`指令调用`_wmain`函数。类似地,对于`_main`和`_wWinMain`也有相应的参数传递逻辑。 #### 返回值处理 当`main`或`WinMain`函数执行完毕后...

    实时系统RTX官方文档中文翻译

    一个RTSS程序可以使用wmain()函数,并接受宽字节输入参数。对WCS家族函数的支持作为RTX支持的C 运行时库的一部分引入进来。 RTX官方文档中文翻译提供了RTX基本特点、进程线程、中断、架构、内存管理、API等方面的...

    Windows编程入门

    控制台程序的入口函数通常是 `main`,其原型可以根据不同的语言标准有所不同: - **C 语言标准**: ```c void main(int argc, char *argv[], char *envp[]); int main(int argc, char *argv[], char *envp[]); `...

    金山kingsoft笔试题2010 c++

    此外,`wmain`函数中使用了`shapes::const_iterator`,应改为`shapes.begin()`,因为`shapes`是范围内的作用域解析运算符,不是命名空间。 5. **STL应用与问题** 使用`std::vector`时,需要注意迭代器失效的问题。...

    VS MAP 文件使用

    ### VS MAP 文件使用详解 #### 一、引言 在软件开发过程中,程序崩溃是常见的问题之一,尤其在复杂的多线程环境中,定位崩溃的原因往往非常困难。Microsoft Visual Studio (以下简称VS) 提供了多种工具和技术来...

    S13-mimikatz源码调试以及MSV功能原理1

    在项目属性中,设置调试入口为`privilege::debug`,调试属性的命令参数设置为`wmain()`,这是Mimikatz的主入口函数。 当调试运行时,Mimikatz接收到命令后,会进入命令分发的过程。核心函数`mimikatz_...

    ACE编程指导方针(使用ACE,扩展ACE的指南)

    - **宏定义**:避免定义过于复杂的宏,尽可能使用内联函数代替。 ##### 3.3 线程安全规范 - **互斥量**:使用ACE提供的互斥量机制(如`ACE_Thread_Mutex`)来保护共享资源。 - **锁**:确保对临界区的访问是原子...

    Windbg使用紹介

    Windbg还支持源代码级别的调试,通过File→Open菜单打开源代码文件,可以看到代码与调试信息的结合视图,左边是源代码,右边是Windbg的输入和输出窗口,方便你进行代码分析和问题定位。 通过这个简单的例子,你已经...

    一个microsoft的exe程序文件的启动过程.docx

    在某些情况下,程序可能会有特定的启动函数,例如`main`或`wmain`(Unicode版本)。这些函数是在`WinMain`调用后,由运行时库根据程序类型调用的。例如,控制台程序通常使用`main`作为入口点,而非Windows GUI程序。...

    S12-Mimikatz源码调试1

    `wmain()`函数作为Mimikatz的入口点,接收并处理命令行参数。 在命令处理阶段,Mimikatz通过`mimikatz_dispatchCommand()`函数进行命令分发。该函数首先调用`kull_m_file_fullPath`方法,但其具体作用在当前上下...

    stack_overflow_win_XP_sp2.pdf

    - `wmain`函数作为程序的入口点,检查命令行参数并调用`getstring`函数。 2. **编译配置**: - 在编译程序时,通过设置项目属性中的“Buffer Security Check”选项启用栈保护机制。这可以通过项目的配置属性页面...

    VS2008 学习笔记

    此外,`_tmain()` 和 `wmain()` 是微软特有的函数入口点,而 `main()` 是符合 ISO/ANSI C++ 标准的可移植性更好的选择。 第二章深入探讨了数据、变量和计算。变量的命名应遵循一定的规则,可以包含字母、数字和...

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

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

    C++编写windows服务程序示例代码

    在本文中,我们将深入探讨如何使用C++编程语言来创建Windows服务程序。Windows服务是一种在后台运行的应用程序,它们不依赖于用户界面,并且通常在系统启动时自动启动。这样的特性使得服务程序非常适合用于需要长期...

    win32和win32 console和MFC程序概况

    在Win32 DLL中单独使用MFC也非常简单,可以通过构造项目的`DllMain`函数实现: 1. **包含必要的头文件**:例如`afxdllx.h`。 2. **定义`AFX_EXTENSION_MODULE`**:这有助于管理DLL中的MFC扩展模块。 3. **构造`...

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

    本篇文章将深入探讨“libwgetopt”这个开源库,特别是它的核心功能——wgetopt()函数,这是一个针对宽字符的getopt()函数实现,特别适合处理Windows环境下wmain()函数中的宽字符参数。 getopt()函数是Unix和POSIX...

    用RawSocket实现的Sniffer的C++Builder源程序

    2. `WMain.cpp`:这可能包含主窗口或应用程序的主要控制逻辑,通常有`WinMain`函数,是程序的入口点。 3. `sniffer.cpp`:此文件很可能包含了嗅探器的主要功能实现,如创建Raw Socket,监听网络流量,解析和显示...

    获取命令行参数

    在编程领域,尤其是在Windows平台下的开发中,Visual C++(简称VC++)是一个常用的集成开发环境,用于创建C++应用程序。在使用VC++编写程序时,有时我们需要获取命令行参数来实现特定的功能或控制程序的行为。命令行...

    vc获取命令行参数并显示

    在VC++中,我们可以使用`main()`函数的参数来访问这些命令行参数。`main()`函数有两个标准形式: ```cpp int main(int argc, char* argv[]) ``` 或者,对于宽字符支持: ```cpp int wmain(int argc, wchar_t* ...

Global site tag (gtag.js) - Google Analytics