VC++ TCHAR类型字符串操作

2024-12-26 16:16:18
推荐回答(2个)
回答1:

TCHAR是单字符
如果要将 c 改成L"D:\\visual studio 2010\\Projects\\XXX.bmp"
则需要这样定义
TCHAR *c=L"D:\\visual studio 2010\\Projects\\XXX.bmp";

回答2:

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字符的第一个字节,则返回