C++字符类型TCHAR、char和wchar_t_hwlfly的博客-程序员秘密_tchar类型

技术标签: C++  TCHAR  char  unicode  MFC  wchar_t  

1、首先,char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。

2、wchar_t是C/C++的字符数据类型,是一种扩展的字符存储方式,wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。

3、wchar_t数据类型一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位[1],总之,wchar_t所能表示的字符数远超char型。标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。

int main() {
    wchar_t wStr[] = L"这是一段中文";
    wcout<<wStr<<endl;
    getchar();getchar();
    return 0;
}

可以用TEXT()方法将char转换成wchar_t
例如: wchar_t appName[5]=TEXT("test");
方法2:
wchar_t* c2w(const char *str)
{
int length = strlen(str)+1;
wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
memset(t,0,length*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
return t;
}

4、TCHAR

因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wcslen,分别用于处理两种字符串。

    微软将这两套字符集及其操作进行了统一,通过条件编译(通过_UNICODE和UNICODE宏)控制实际使用的字符集,这样就有了_T("")这样的字符串,对应的就有了_tcslen这样的函数
为了存储这样的通用字符,就有了TCHAR:

当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen[1]

#ifdef UNICODE
    typedef wchar_t TCHAR;
#else
    typedef char TCHAR;
#endif

当我们定义了UNICODE宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHAR就会摇身一变,变成了wchar_t。而未定义UNICODE宏时,TCHAR摇身一变,变成了unsignedchar。这样就可以很好的切换宽窄字符集。
tchar可用于双字节字符串,使程序可以用于中日韩等国 语言文字处理、显示。使编程方法简化。

5、_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_tStr[] = L"Hello World!";
这个就是双字节存储字符了。
_T是一个适配的宏~

#ifdef _UNICODE的时候
_T就是L
没有#ifdef _UNICODE的时候
_T就是ANSI的。

#ifdef UNICODE
    typedef wchar_t TCHAR;
#else
    typedef char TCHAR;
#endif



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/h_wlyfw/article/details/20443531

智能推荐

Java开源模板引擎_wx5701619的博客-程序员资料_java 模板引擎原理

Velocity Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序

Unix/Linux下几个最致命的命令_虎皮猫大人王的博客-程序员资料

本文主要参考了以下原文:http://www.linuxpromagazine.com/Online/News/Seven-Deadliest-Linux-Commandshttp://ubuntuforums.org/announcement.php?f=326大多数时候程序员性情温和,神情淡定。但是会有例外,当他们因为加班加点过度劳累,在意识脆弱、头脑短路、麻痹大意时执行了

R语言应用实战-聚类分析以及k-means的优缺点_普通网友的博客-程序员资料_r型聚类分析的优缺点

一.聚类概念聚类分析cluster Analysis)是研究物以类聚的现代统计方法。在过去是依靠经验和专业知识做定性分析处理,很少利用数学方法多元统计分析逐渐被引进数值分类,形成聚类分析的分支。以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!MATLAB-30天带你从入门到精通MATLAB深入理解高级教程(附源码)tableau可视化数据分析高级教程思想:认为所研究的样本或指标(变量)之间存在着不同程度的相似性(亲疏关系)。于是根据一批样本的

Centos 8 | 网络_enobear的博客-程序员资料

网络配置说明新安装的 Centos 8 默认网卡是没有启动的。默认只能通过NetworkManager.service进行网络配置。没有传统的network.service,但依然支持。NMNM服务是管理和监控网络设置的守护进程,它是一个动态的,事件驱动的网络管理服务。命令# 重启NMsystemctl restart NetworkManager# 查看网络连接nmcli c# 查看网卡信息nmcli d# 查看ipnmcli# 重新加载网络nmcli c relo

create-react-app 创建页面打开没有显示_Ordinary_hermit的博客-程序员资料

react创建网页显示空白,可能会遇到的问题

不是太细的java自学笔记4(p366-p388)(java异常,自定义异常,throw,throws)_NoN小旻的博客-程序员资料

59.异常抓抛模型:抛出:出现异常,会生成一个对应异常类的对象。并将此对象抛出。一旦抛出异常之后,其后代码不再执行。抓:异常处理方式,第一种try-catch-finally,第二种fhrowstry-catch-finally的使用try{ //可能出现的异常 }catch(异常类型1 变量名1){ //异常处理方式1 }catch(异常类型2 变量名2){ //异常处理方式2 } ... finally{//一定会执行的代码}//案例...

随便推点

统一诊断服务(UDS)_晓翔仔的博客-程序员资料_uds 库

统一诊断服务(Unified Diagnostic Services),简称UDS。是ISO 15765和ISO 14229定义的一种汽车通用诊断协议

考研复试408问题(还在更新)_聚精会神搞学习的博客-程序员资料

面试问题之编程语言:c++的特点是什么?封装,继承,多态,支持面向对象和面向过程的开发c++的异常处理机制?抛出异常和捕捉异常进行处理。c++和c,java的区别?c是纯过程,c++是对象加过程,java是存面向对象纯虚函数?被virtual修饰的成员函数,再基类不能实现,而他的实现放到派生类中实现什么是内存泄漏?申请了一块内存空间,使用完毕后没有释放掉计算机网络:TCP/IP分层五层模型:物理层,数据链路层,网络层,运输层,应用层七层模型:物理层,数据链路层,网

mysql中like % %模糊查询_斜阳雨陌的博客-程序员资料_like %

1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。 另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件 SELECT * F...

LIKE的用法_Serendipity的人的博客-程序员资料_like函数的用法

我们来谈谈关于like运算符的理解:下面是like的语法,以后使用到like运算符的都必须根据这个语法使用LIKE运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1。下划线“_”百分号“%”百分号(%)代表零个、一个或多个数字或字符。下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。下面举例下划线“_”的用法:下划线代表单个字符。以下查找StudentNumber中第二个字符为.

java web方向专业术语_Eikis的博客-程序员资料

1、TomcatTomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。(是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目)。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可

推荐文章

热门文章

相关标签