Windows、字符集和_T宏

1.Windows两个字符集

ANSI(8位):Windows98及其以前版本,类似ASCII,占一个字节。英文

Unicode(16位):Windows NT和Windows 2000,ANSI的超集,占两个字节。中文

2.两种字符集对应的应用程序

基于ANSI的程序可以在Windows NT和Windows 2000上运行,稍慢;

基于Unicode的程序不能在Windows 98上运行,除非将每个传递给Windows的字符串由Unicode转换为ANSI格式。

3.编译方式

如:若为“Hello”,编译器将从ANSI字符组成该字符串;

若为L“Hello”,编译器将用Unicode字符;

若为_T"Hello",则为MFC的_T宏。

如果定义了_UNICODE,那么编译器使用Unicode字符,否则,编译器将使用ANSI字符。

Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。
如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。

  LPSTR:32bit指针指向一个字符串,每个字符占1字节

  LPCSTR:32-bit指针指向一个常字符串,每个字符占1字节

  LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义

  LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定


4.使用

使用_T宏修饰字符串常量并不一定能使应用程序完全不关心其字符集,需注意:

a.将字符声明为TCHAR型而非char型。若定义了_UNICODE,TCHAR为wchar_t,16位;若无定义_UNICODE,则TCHAR为char。

b.不要用char*或wchar*声明TCHAR字符串指针,而应用TCHAR*,或LPTSTR,LPCTSTR。

c.不要认为一个字符只有8bit,可用sizeof(TCHAR)求缓冲区长度。

d.将对C运行时间库(strcpy)中字符串的调用替换为Windows头文件Tchar.h(_tcscpy)中的对应宏。

5.实例

例1:使用ANSI字符集

char szMsg[256];

pWnd->GetWindowText(szMsg,sizeof(szMsg));

strcat(szMsg,"Hello");

MessageBox(szMsg);

例2:将以上代码改为与字符集无关

TCHAR szMsg[256];

pWnd->GetWindowText(szMsg,sizeof(szMsg)/sizeof(TCHAR));

_tstrcat(szMsg,_T("Hello"));

MessageBox(szMsg);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值