VC++中的char wchar_T和TCHAR.doc_第1页
VC++中的char wchar_T和TCHAR.doc_第2页
VC++中的char wchar_T和TCHAR.doc_第3页
VC++中的char wchar_T和TCHAR.doc_第4页
VC++中的char wchar_T和TCHAR.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱。为了统一,有必要把来龙去脉搞清楚。 为了搞清这些函数,就必须理请几种字符类型的写法。char就不用说了,先说一些wchar_t。wchar_t是Unicode字符的数据类型,它实际定义在里:typedef unsigned short wchar_t;不能使用类似 strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。为了让编译器识别Unicode字符串,必须以在前面加一个 “L”,例如:wchar_t *szTest=LThis is a Unicode string.;下面在看看TCHAR。如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。如果你使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。以strcpy函数为例子,总结一下:.如果你想使用ANSI字符串,那么请使用这一套写法:char szString100;strcpy(szString,test);.如果你想使用Unicode字符串,那么请使用这一套:wchar_t szString100;wcscpyszString,Ltest);.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:TCHAR szString100;_tcscpy(szString,_TEXT(test);2.字符串及处理之三: 使用TCHAR系列方案使用TCHAR系列方案编写程序TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。 TCHAR的引入,主要是在Tchar.h文件中,该文件包含这方面的重要的定义信息。 对于包含了对str函数或wcs函数进行显式调用的代码来说,无法非常容易地同时为ANSI和Unicode对这些代码进行编译。本章前面说过,可以创建同时为ANSI和Unicode进行编译的单个源代码文件。若要建立双重功能,必须包含TChar.h文件,而不是包含String.h文件。 TChar.h文件的唯一作用是帮助创建ANSI/Unicode通用源代码文件。它包含你应该用在源代码中的一组宏,而不应该直接调用str函数或者 wcs函数。如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数。如果没有定义_UNICODE,那么这些宏将引用str这组宏。 TCHAR的定义如下: #ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif 所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t。 还有一个宏来处理定义Unicode字符串常量时所需的L前缀。 #ifdef UNICODE #define _T(x) L#x #define _TEXT(x) L#x #define _T(x) L#x #else #define _T(x) x #define _TEXT(x) x #define _T(x) x #endif # 是一个预处理操作符,它可以把两个参数连在一起。如果你的代码中需要字符串常量,在它前面加上_T宏。如果你使用Unicode来build,它会在字符串常量前加上L前缀。 TCHAR szNewText = _T(we love Bob!); _UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。像是用宏来隐藏SetWindowTextA/W的细节一样,还有很多可以供你使用的宏来实现str*()和_mbs*()等字符串函数。例如,你可以使用_tcsrchr宏来替换strrchr()、_mbsrchr()和wcsrchr()。_tcsrchr根据你预定义的宏是_MBCS还是 UNICODE来扩展成正确的函数,就象SetWindowText所作的一样。 不仅str*()函数有TCHAR宏。其他的函数如, _stprintf(代替sprinft()和swprintf()),_tfopen(代替fopen()和_wfopen())。 MSDN中Generic-Text Routine Mappings.标题下有完整的宏列表。3.字符串及处理之二: 基本字符串类型及函数 常用的字符串类型有:char * ,wchar_t * ,WCHAR * , TCHAR *char * 最基本的类型,其对应的一组处理函数是以str.开头的标准的ANSI C字符串函数。wchar_t * 是这样定义的:typedef unsigned short wchar_t; 另外,在头文件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t wchar_t * 是16-bit UNICODE character(宽字符)所使用的基本类型。其对应的一组处理函数是以wcs.开头的标准的字符串函数。常用的字符串处理函数和宏: 1、str 开头的 函数 处理SBCS字符串2、wcs 开头的 函数 处理宽字符串,wcs是宽字符串的英文缩写 所有的unicode函数均以wcs开头。若要调用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。 对于每一个标准的ANSI C字符串函数,基本都有等价的unicode函数.3、_mbs 开头的 函数 处理DBCS字符串 微软还在它的CRT(C runtime library)中增加了操作DBCS字符串的版本。Str*()函数都有对应名字的DBCS版本_mbs*()。 如果你料到可能会遇到DBCS字符串(如果你的软件会被安装在使用DBCS编码的国家,如中国,日本等,你就可能会),你应该使用_mbs*()函数,因为他们也可以处理SBCS字符串。(一个DBCS字符串也可能含有单字节字符,这就是为什么_mbs*()函数也能处理SBCS字符串的原因)。微软还提供了几个函数方便对dbcs的处理 , 见后面的描述。 如果只是调用strlen函数,那么你无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。ANSI的C运行期库中没有配备相应的函数,使你能够对双字节字符集进行操作。但是,Microsoft Visual C+的运行期库却包含许多函数,如_mbslen ,它可以用来操作多字节(既包括单字节也包括双字节)字符串。4、_tcs 开头的 宏 配合TCHAR使用 根据预定义分别扩展为str wcs _mbs, 见后面的描述。5、l开头的windows自带的宽字符处理函数6、大小写兼有的 windows自带的宽字符处理函数 5和6见后面的描述更进一步的字符串以及其指针的类型定义由于Win32 API文档的函数列表使用函数的常用名字(例如, SetWindowText),所有的字符串都是用TCHAR来定义的。(除了XP中引入的只适用于Unicode的API)。下面列出一些常用的 typedefs,你可以在msdn中看到他们。type Meaning in MBCS builds Meaning in Unicode builds WCHAR wchar_twchar_t LPSTR char* char*LPCSTR const char*const char*LPWSTR wchar_t*wchar_t* LPCWSTR const wchar_t* const wchar_t* TCHAR charwchar_t LPTSTR TCHAR* TCHAR* LPCTSTR const TCHAR* const TCHAR* 4.strings(字符串)详解(一) 之所以抛弃char*的字符串而选用C+标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,= 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C+的基本数据类型。好了,进入正题首先,为了在我们的程序中使用 string类型,我们必须包含头文件 。如下:#include /注意这里不是string.h string.h是C字符串头文件1声明一个C+字符串声明一个字符串变量很简单:string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:a)string s;/生成一个空字符串sb)string s(str) /拷贝构造函数 生成str的复制品c)string s(str,stridx) /将字符串str内“始于位置stridx”的部分当作字符串的初值d)string s(str,stridx,strlen) /将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e)string s(cstr) /将C字符串作为s的初值f)string s(chars,chars_len) /将C字符串前chars_len个字符作为字符串s的初值。g)string s(num,c) /生成一个字符串,包含num个c字符h)string s(beg,end) /以区间beg;end(不包含end)内的字符作为字符串s的初值i)s.string() /销毁所有字符,释放内存都很简单,我就不解释了。2字符串操作函数这里是C+字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。a) =,assign() /赋以新值b) swap() /交换两个字符串的内容c) +=,append(),push_back() /在尾部添加字符d) insert() /插入字符e) erase() /删除字符f) clear() /删除全部字符 g) replace() /替换字符h) + /串联字符串i) =,!=,=,compare()/比较字符串j) size(),length()/返回字符数量k) max_size() /返回字符的可能最大个数l) empty()/判断字符串是否为空m) capacity() /返回重新分配之前的字符容量n) reserve() /保留一定量内存以容纳一定数量的字符o) , at() /存取单一字符p) ,getline() /从stream读取某值q) ,=,=,=,!=),甚至支持string与C-string的比较(如 str,=,=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string(“aaaa”) string(aaaaa)。另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等 0-大于 从输入流读取一个string。2 把一个string写入输出流。另一个函数就是getline(),他从输入流读取一行内容,直到遇到分行符或到了文件尾。28搜索与查找查找函数很多,功能也很强大,包括了:find()rfind()find_first_of()find_last_of()find_first_not_of()find_last_not_of()这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。所有的函数的参数说明如下:第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜寻的字符个数。比较简单,不多说 不理解的可以向我提出,我再仔细的解答。当然,更加强大的STL搜寻在后面会有提及。最后再说说npos的含义,string:npos的类型是string:size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string:size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较(如:if(s.find(“jia”)=string:np

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论