tchar ANSI编码 Unicode编码

    因为C++支持两种字符串,即常规的 ANSI 编码(使用""包裹)和 Unicode 编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wcslen,分别用于处理两种字符串
    微软将这两套 字符集 及其操作进行了统一,通过 条件编译 (通过_UNICODE和UNICODE宏)控制实际使用的字符集,这样就有了_T("")这样的字符串,对应的就有了_tcslen这样的函数
    为了 存储 这样的通用 字符 ,就有了TCHAR,tchar是通过define定义的字符串宏:
    当没有定义_UNICODE宏时,TCHAR = char,_tcslen = strlen
    当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
    当我们定义了UNICODE宏,就相当于告诉了 编译器 :我准备采用UNICODE版本。这个时候, TCHAR 就会摇身一变,变成了wchar_t。而未定义UNICODE宏时,TCHAR摇身一变,变成了unsigned  char。这样就可以很好的切换宽窄 字符集
            tchar 可用于双 字节 字符串,使程序可以用于中日韩等国 语言文字处理、显示。使编程方法简化。
 
---------------------------------------------------------------
补充:_T("")的含义
--
定义:
_T("")是一个宏,定义于tchar.h下。
#define __T(x) L ## x
#define _T(x) __T(x)
作用:
他的作用是让你的程序支持Unicode编码,
因为Windows使用两种 字符集 ANSI和UNICODE,
前者就是通常使用的单 字节 方式,
但这种方式处理象中文这样的双 字节 字符 不方便,
容易出现半个汉字的情况。
而后者是双 字节 方式,方便处理双字节 字符
Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。
如果你编译一个程序为ANSI方式,
_T实际不起任何作用。
而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。
LPSTR:32bit 指针 指向一个 字符 串,每个字符占1 字节
LPCSTR:32-bit 指针 指向一个常 字符 串,每个字符占1 字节
LPCTSTR:32-bit 指针 指向一个常 字符 串,每字符可能占1 字节 或2字节,取决于Unicode是否定义
LPTSTR:32-bit 指针 字符 可能占1 字节 或2字节,取决于Unicode是否定义
L是表示字符串资源为Unicode的。
比如
wchar_t Str[] = L"Hello World!";
这个就是双字节存储字符了。
_T是一个适配的宏~
#ifdef _UNICODE的时候
_T就是L
没有#ifdef _UNICODE的时候
_T就是ANSI的。
比如
LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上两句使得无论是在UNICODE编译条件下还是在ANSI编译条件下都是正确编译的。
而且MS推荐你使用相匹配的 字符串函数
比如处理LPTSTR或者 LPCTSTR 的时候,不要用strlen ,而是要用_tcslen
否则在 UNICODE 的编译条件下,strlen不能处理 wchar_t *的字符串。
T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种 字符集 ?编译的时候才决定
***********************************************************************************************************************************************************
LPCTSTR类型:
L表示long 指针 这是为了兼容Windows 3.1等16位 操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far 修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针
C表示是一个常量
T表示在Win32环境中, 有一个_T宏
STR表示这个变量是一个字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值