1,在VS2010 编译器的菜单上 “项目----属性---左侧的配置属性----常规---右侧的 字符集 ”可以对项目所要使用的字符集进行定义,可以选择”使用Unicode字符集“、“使用多字节字符集”等等。

2,MessageBox 有三个版本:MessageBoxA, MessageBoxW, MessageBox;

****************************************

WINUSERAPI

int

WINAPI

MessageBoxA(

__in_optHWND hWnd,

__in_optLPCSTR lpText,

__in_optLPCSTR lpCaption,

__in UINTuType);

WINUSERAPI

int

WINAPI

MessageBoxW(

__in_optHWND hWnd,

__in_optLPCWSTR lpText,

__in_optLPCWSTR lpCaption,

__in UINTuType);

#ifdef UNICODE

#define MessageBox  MessageBoxW

#else

#define MessageBox  MessageBoxA

#endif // !UNICODE

**********************************************

即:如果项目设置使用UNICODE字符集, MessageBox 就是 MessageBoxW, 否则 MessageBox就是 MessageBoxA;

在MessageBoxA函数的第二和第三个参数的类型都是LPCSTR ,它是什么呢?

typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;

它是 CONST CHAR, CONST CHAR 是什么?

#ifndef CONST

#defineCONST              const

#endif

typedef char CHAR;

所以 CONST CHAR 就是 const char; 所以MessageBoxA中的第二和第三个参数要是多字节(ANSI)类型常量的。

在MessageBoxW函数的第二和第三个参数的类型都是LPCWSTR ,它是什么呢?

typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;

它是 CONST WCHAR; CONST WCHAR又是什么?

#ifndef CONST

#defineCONST              const

#endif

#ifndef _MAC

typedef wchar_tWCHAR;    //wc,   16-bit UNICODEcharacter

#else

// some Macintosh compilers don't define wchar_t in a convenientlocation, or define it as a char

typedef unsigned shortWCHAR;    //wc,   16-bit UNICODEcharacter

#endif

所以CONST WCHAR 就是 const wchar_t ,所以MessageBoxW中的第二和第三个参数要是16位的UNICODE 常量。

3,CString 也有三个版本,CStringA, CStringW, CString;

**************************************************

typedef ATL::CStringT< wchar_t,StrTraitMFC_DLL< wchar_t >> CStringW;

typedef ATL::CStringT< char,StrTraitMFC_DLL< char >> CStringA;

typedef ATL::CStringT< TCHAR,StrTraitMFC_DLL< TCHAR >> CString;

******************************************************************

4,上面CString 模板中的 TCHAR 是什么?

*****************************************************************

//

// Neutral ANSI/UNICODE types and macros

//

#ifdef UNICODE                    // r_winnt

#ifndef _TCHAR_DEFINED

typedef WCHAR TCHAR, *PTCHAR;

typedef WCHAR TBYTE , *PTBYTE ;

#define _TCHAR_DEFINED

#endif

#else                // r_winnt

#ifndef _TCHAR_DEFINED

typedef char TCHAR, *PTCHAR;

typedef unsigned char TBYTE , *PTBYTE ;

#define _TCHAR_DEFINED

#endif

即:如果项目设置使用UNICODE字符集 ,TCHAR 就是 WCHAR,也就是wchar_t;否则 TCHAR 就是char;所以项目设置使用UNICODE字符集, CString就是CStringW, 否则CString 就是CStringA.

5 在给宽字节变量赋值时,可以在值前加“L”,也可以加“_T”,比如:

wstring x(L"你好");

CStringW y(L"再见");

wstring x(_T("你好") );

CStringW y(_T("再见") );

在值前加“L”是常见用法,那么“_T”表示什么呢?

#define_T(x)      __T(x)

#define_TEXT(x)   __T(x)

那么 __T(x) 是什么?

#ifdef UNICODE                    // r_winnt

#define __TEXT(quote)L##quote     // r_winnt

#else                // r_winnt

#define __TEXT(quote)quote        // r_winnt

#endif               // r_winnt

即:如果项目设置使用UNICODE字符集, “_T” 就相当于“L”,否则加“_T”就如同没加。

6  ANSI 与 UNICODE的混合编程。编程时,使用ANSI节省存储空间,但遇到处理中文时很不方便。如何使所编写的一个程序在处理英文时,使用ANSI字符集,在处理中文时,使用UNICODE字符集,并且不需要修改大量代码。

a, 使用CString 类型的字符串变量;

b, 使用MessageBox 来弹出消息;

c, 使用TCHAR类型的字符变量;

d, 使用_T来表示宽字节字符。

在项目设置使用UNICODE字符集时,CString 就相当于CStringW,MessageBox就相当于MessageBoxW,TCHAR 就相当于wchar_t, _T就相当于L;

在项目设置使用多字节字符集时,CString就相当于CStringA, MessageBox就相当于MessageBoxA,TCHAR就相当于char,_T就相当于不存在。

比如一条语句:

CString  x( _T("大家好") );

在项目设置使用UNICODE字符集时,CString 就相当于 CStringW, x中存储的字符长度为3,_T就相当于L;在项目设置使用多字节字符集时,CString 就相当于CStringA, x中存储的字符长度为6。

而string 和 wstring 却没有类似的转化功能。

typedef basic_string<char,char_traits<char>,allocator<char> >string;

typedef basic_string<wchar_t,char_traits<wchar_t>,allocator<wchar_t> >wstring

当然如果处于某种考虑,某个变量就要存储 宽字节字符,而不是存储ANSI字符,就可以显式的使用CStringW类型,而不是使用CString。

补充说明:编译错误。
_T只能把字符串文字量(也就是双引号括起来的字符串)或者字符文字量(也就是单引号括起来的字符)转化为所需的样子。它无法把一个CHAR转化为一个TCHAR,也无法把一个LPSTR转化为一个LPTSTR。

为什么会这样呢?答案是:因为C++语法。
目前的C++语法,支持两种字符串。一种是直接用引号括起的,比如"Hello, World.",另一种是用引号括起,前面再加一个字母L的,比如L"Hello, World."。前一种字符串的类型是char*,或者说是const char*,后一种字符串的类型是wchar_t*,或者说是const wchar_t*。
在Visual Studio 2010中,_T是一个宏。它的作用是:如果当前的工程设置是Unicode,则在前面加一个L,否则就什么也不加。换句话说,如果工程设置为Unicode,_T("a")就相当于L"a",否则,_T("a")就相当于"a"。楼主写一个_T(text),如果工程设置为Unicode,就变成了Ltext,于是编译就出错了:没有Ltext这个变量。

如何解决?
方法1、如果是从Visual Studio 6.0升级过来的代码,因为它的工程默认设置不是Unicode的,而Visual Studio 2010的工程默认设置是Unicode的,造成问题。遇到这种情况,直接在Visual Studio 2010里面修改工程设置为不是Unicode即可。
方法2、对于那个函数而言,可以调用TextOut的非Unicode版本。
TextOut(xdc,x,y,_T(text),strlen(text));
修改为
TextOutA(xdc,x,y,text,strlen(text));
方法3、如果彻底一点,一定要用Unicode的话,微软提供了MultiByteToWideChar函数,可以用于转化,楼主可以查查这方面的资料。

在VS2010下使用 UNICODE 和 ANSI 的混合编程相关推荐

  1. Windows下的Matlab与Java的混合编程,Java调用matlab编译的jar包(linux下请看我另外版本!)

    近来因为甲方需要做拟合等功能,需要用到matlab软件,并将其功能在java中实现,然后在服务器上也要实现,因为之前根本没有听说过,所以我苦心泣血,狂干一星期找到了,踩了无数个坑,终于实现了,因此想分 ...

  2. 有关UNICODE、ANSI字符集和相关字符串操作的总结[转]

    Q UNICODE字符串如何显示 A 如果程序定义了_UNICODE宏直接用 WCHAR *str=L"unicodestring"; TextOut(0,0,str); 否则就需 ...

  3. 移植性问题のCString类型转换,字符串操作和UNICODE、ANSI字符集

    一.CString与LPCWSTR 两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处.而 ...

  4. UNICODE与ANSI的区别

    帮同学写个播放音乐的代码,用的是vs2005,本来调用下API中的mciSendSrring()就很容易解决,后发现老是有warning: incompatible types - from 'cha ...

  5. Unicode和ANSI之间转换 - NotePad++轻松实现

    今天碰到一个关于UNICODE和ANSI相互转换的问题,作为一个程序员,我首先想到的是用WideCharToMultiByte/MultiByteToWideChar实现,这个我想大家都会了,我也会在 ...

  6. 介绍一下unicode,ansi,utf-8,unicode big endian编码

    介绍一下unicode,ansi,utf-8,unicode big endian编码 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状 ...

  7. 字符集和编码 UNICODE、ANSI、UTF-8、GB2312 都是什么鬼

    这是我在网上看到的一篇通俗易懂的教程,但是无法找到原作者的署名,故直接搬过来了 不是本人所作,特此声明 快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char ...

  8. 为什存在_tmain以及Unicode和ANSI

    main()是标准C++的函数入口.标准C++的程序入口点函数,默认字符编码格式ANSI 函数签名为: int main(); int main(int argc, char* argv[]);_tm ...

  9. 【流媒體】jrtplib—VS2010 下RTP开源协议库JRTPLIB3.9.1编译

    [流媒體]jrtplib-VS2010下RTP开源协议库JRTPLIB3.9.1编译 SkySeraph Apr 7th 2012 Email:skyseraph00@163.com 一.JRTPLI ...

最新文章

  1. 通过Appium获取Android app中webview
  2. android系统应用程序,Android系统应用程序基本概念解读
  3. 学习笔记整理之对象的转型
  4. 为什么volatile不能保证原子性而Atomic可以?
  5. oa 系统后期安装服务
  6. java date 转换sql date_java.util.Date和java.sql.Date之间的转换
  7. 深入理解JVM读书笔记--Class文件结构
  8. 台式计算机的主流配置,2017年台式电脑主流配置单
  9. windows安装grafana
  10. python入门指南-如何学习Python,以及新手如何入门?
  11. c语言程序的生命周期(编写、预处理、编译、汇编、链接、执行)
  12. ccfb类会议有哪些_CCF推荐的国际学术会议和期刊目录修订版发布
  13. 如何在IBM SPSS Statistics中进行K均值聚类分析
  14. css3扭蛋机,微信小程序扭蛋抽奖机css3动画实现详解.pdf
  15. 计算机网络修复提示DNS服务器,dns的服务器故障怎么办,电脑dns异常修复了没用...
  16. (附源码)计算机毕业设计SSM基于web的网上订餐系统
  17. Ubuntu 用GParted调整分区大小
  18. gene prediction commend 3
  19. 电容分类---等级划分
  20. 人工智能的现状及未来发展

热门文章

  1. H5页面遮罩弹框下层还能滚动的问题
  2. 聊下并发和Tomcat线程数(Updated)
  3. cropped-img_2692.jpg
  4. 怎么删除XP中无法删除的文件
  5. Oracle学习笔记:创建logical standby
  6. InfoPath Forms Services的配置
  7. linux下VNC配置详解
  8. PostgreSQL 数据访问 offset 的质变 case
  9. 好玩的东西——一个代码片段
  10. scala_until