VC++ TCHAR类型字符串操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++ TCHAR类型字符串操作相关的知识,希望对你有一定的参考价值。

恳请高手帮忙 TCHAR c = L"D:\visual studio 2010\Projects" 如何把TCHAR c 改成L"D:\\visual studio 2010\\Projects\\XXX.bmp"

参考技术A 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."标题下有完整的宏列表。
Windows字符串函数
Windows还提供了一组范围很广的字符串操作函数。这些函数与C运行期字符串函数(如strcpy和wcscpy)很相似。但是该操作系统函数是操作系统的一个组成部分,操作系统的许多组件都使用这些函数,而不使用C运行期库。建议最好使用操作系统函数,而不要使用C运行期字符串函数。这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。
若要使用这些函数,系统必须运行Windows
2000或Windows
98。如果安装了Internet
Explorer
4.0或更新的版本,也可以在较早的Windows版本中获得这些函数。
在经典的操作系统函数样式中,操作系统字符串函数名既包含大写字母,也包含小写字母,它的形式类似这个样子:StrCat、StrChr、StrCmp和StrCpy等。若要使用这些函数,必须加上ShlWApi.h头文件。另外,如前所述,这些字符串函数既有ANSI版本,也有Unicode版本,例如StrCatA
和StrCatW。由于这些函数属于操作系统函数,因此,当创建应用程序时,如果定义了UNICODE(不带前置下划线),那么它们的符号将扩展为宽字符版本。
Windows也提供了一组用于对Unicode字符串进行操作的函数,表2
-
4对它们进行了描述。
表2-4
对Unicode字符串进行操作的函数
函数描述
lstrcat
将一个字符串置于另一个字符串的结尾处
lstrcmp
对两个字符串进行区分大小写的比较
lstrcmpi
对两个字符串进行不区分大小写的比较
lstrcpy
将一个字符串拷贝到内存中的另一个位置
lstrlen
返回字符串的长度(按字符数来计量)
这些函数是作为宏来实现的,这些宏既可以调用函数的Unicode版本,也可以调用函数的ANSI版本,这要根据编译源代码模块时是否已经定义了UNICODE而定。例如,如果没有定义UNICODE,lstrcat函数将扩展为lstrcatA。如果定义了UNICODE,lstrcat将扩展为lstrcatW。
在windows环境下操作DBCS:
如果只是调用strlen函数,那么无法真正了解字符串中究竟有多少字符,它只能知道到达结尾的0之前有多少个字节。ANSI的C运行期库中没有配备相应的函数,能够对双字节字符集进行操作。但是,Microsoft
Visual
C++的运行期库却包含许多函数,如_mbslen
,它可以用来操作多字节(既包括单字节也包括双字节)字符串。
为了帮助对DBCS字符串进行操作,Windows提供了下面的一组帮助函数(见表2
-
1
)。前两个函数CharNext
和CharPrev
允许前向或逆向遍历DBCS字符串,方法是每次一个字符。第三个函数IsDBCSLeadByte,
在字节返回到一个两字字节符的第一个字节时将返回TRUE。
表2-1
对DBCS字符串进行操作的帮助函数
PTSTR
CharNext(PCTSTR
pszCurrentChar);
返回字符串中的下一个字符的地址
PTSTR
CharPrev(PCTSTR
pszStart,PCTSTR
pszCurrentChar
);
返回字符串中的上一个字符的地址
BOOL
IsDBCSLeadByteTRUE(BYTE
bTestChar);
如果该字节是DBCS字符的第一个字节,则返回

以上是关于VC++ TCHAR类型字符串操作的主要内容,如果未能解决你的问题,请参考以下文章

从char/wchar_t到TCHAR (续)

VC++ 6.0当中,CString和string这两种类型有啥区别?

注册表操作(VC_Win32)

在 VC++ 中如何查找字符串

TCHAR

C++ WCHAR 操作