【转】TCHAR

TCHAR 就是当你的字符设置为什么就是什么
例如:

当程序编译为    ANSI,    TCHAR 相当于 CHAR
当程序编译为 UNICODE, TCHAR 相当于WCHAR

char       : 单字节变量类型,最多表示256个字符

wchar_t : 宽字节变量类型,用于表示Unicode字符

它实际定义在<string.h>里:typedef unsigned short wchar_t。

为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下:

wchar_t c = `A‘ ; 
wchar_t * p = L"Hello!" ; 
wchar_t a[] = L"Hello!" ;

其中,宽字节类型每个变量占用2个字节,故上述数组a的sizeof(a) = 14

TCHAR / _T( ) : 
如果在程序中既包括ANSI又包括Unicode编码,需要包括头文件tchar.h。

TCHAR是定义在该头文件中的宏,它视你是否定义了_UNICODE宏而定义成: 
定义了_UNICODE:    typedef wchar_t TCHAR ; 
没有定义_UNICODE: typedef char TCHAR ;

#ifdef UNICODE 
typedef char TCHAR; 
#else 
typede wchar_t TCHAR; 
#endif 
_T( )也是定义在该头文件中的宏,视是否定义了_UNICODE宏而定义成
定义了_UNICODE:    #define _T(x) L##x 
没有定义_UNICODE: #define _T(x) x 
注意:如果在程序中使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了,而必须使用tchar.h中定义的_tcsXXX函数

一、 在字符串前加一个L作用: 
   如  L"我的字符串"    表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。 
  strlen("asd")   =   3;   
  strlen(L"asd")   =   6; 
  二、  _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式 
   如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。 
   如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD" 
三、TEXT,_TEXT 和_T 一样的 
如下面三语句:   
  TCHAR   szStr1[]   =   TEXT("str1");   
  char   szStr2[]   =   "str2";   
  WCHAR   szStr3[]   =   L("str3");   
  那么第一句话在定义了UNICODE时会解释为第三句话,没有定义时就等于第二句话。   
  但二句话无论是否定义了UNICODE都是生成一个ANSI字符串,而第三句话总是生成UNICODE字符串。   
  为了程序的可移植性,建议都用第一种表示方法。   
  但在某些情况下,某个字符必须为ANSI或UNICODE,那就用后两种方法。

时间: 2024-11-05 06:02:37

【转】TCHAR的相关文章

String,CString,TCHAR,char之间区别和联系

char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char; TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符 #ifdef UNICODE   typedef wchar_t TCHAR;   #else   typedef char TCHAR;   #endif 所以用MBCS来build时,TCHAR是char,使用UN

QString 和 TCHAR 的相互转换

参考资料: http://www.cnblogs.com/fuyanwen/p/3200536.htmlhttp://www.cnblogs.com/wendao/archive/2012/07/27/2612597.html 不能直接用: QString szqFileName = QString::fromLocal8Bit("data");const char* szName = szqFileName.toLocal8Bit().constData(); // 返回的 QByt

关于 char 、 wchar_t 、 TCHAR 、 _T() ||| 宏 _T 、 TEXT 、 _TEXT 、 L

char :单字节变量类型,最多表示256个字符, wchar_t :宽字节变量类型,用于表示Unicode字符, 它实际定义在<string.h>里:typedef unsigned short wchar_t. 为了让编译器识别Unicode字符串,必须以在前面加一个"L",定义宽字节类型方法如下: wchar_t c = `A' ;wchar_t * p = L"Hello!" ;wchar_t a[] = L"Hello!"

[C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串

作者:zyl910 如今,UTF-8字符串的使用频率越来越多了.但是在VC中,不能直接处理UTF-8字符串,得专门去写UTF-8与窄字符串.宽字符串.TCHAR字符串相互转换的代码.不仅费时费力,而且稍不留心就容易造成内存泄露问题.于是我便想专门编写个库来解决UTF-8字符串编码问题. 特性——支持 TCHAR,能随时切换项目字符集配置.兼容 32位(x86)与64位(x64)Windows环境.兼容 VC2005 及更高版本的 VC. 一.设计思路 ATL中的字符串转换宏用起来很方便,于是我打

推荐的tchar.h中的字符串处理函数

在网上找类似_tcslen的函数集,但是居然找不到,又想到我常常要用到,所以我就自己来整理了,主要是通过看tchar.h的源代码来整理的. 在这之前,先看一下下面的代码: #ifdef _UNICODE #define _tcslen  wcslen #else #define _tcslen strlen #endif 可以看出来,系统也提供了UNICODE版本的字符串处理函数,但是为了编程方面的规范和方便,我觉得还是使用类似_tcslen的函数比较好,虽然比较难记,但是用多了就记得了.下面开

tchar.h的源代码

下一章会整理一下tchar.h里常见的字符串处理函数,这一章没有给出全部的代码,就给出了一些主要的宏定义 /* ++++++++++++++++++++ UNICODE ++++++++++++++++++++ */ #include <wchar.h> #ifdef __cplusplusextern "C" {#endif /* __cplusplus */ #ifndef _WCTYPE_T_DEFINEDtypedef unsigned short wint_t;t

TCHAR

定义 TCHAR :通过define 定义的字符串宏 因为C++支持两种字符串:常规的ANSI编码 (使用""包裹).Unicode编码(使用L" "包裹).因此对应的有两套字符串处理函数. 比如:strlen 和 wcslen  分别用于处理两种字符串 使用 微软将这两套 字符集 及其 操作 进行了统一.通过条件编译(_UNICODE 和 UNICODE宏)控制实际使用的字符集,因此出现了 _T(" ") 这样的字符串.与之对应的就有了 _tc

char,wchar_t,CHAR,WCHAR,TCHAR,PSTR,PCSTR,PCTSTR,_T,_TEXT,L

首先,这是一个字符集的问题.在ANSI字符集中,字符类型是char,在UNICODE字符集中,字符类型是wchar_t,也可以称之为宽字符,宽字符占两个字节. 然后,我们来看一段定义代码: //winnt.h typedef char CHAR; //8位 typedef wchar_t WCHAR; //16位 typedef CHAR *PCHAR; typedef CHAR *PSTR; typedef CONST CHAR  *PCSTR; typedef WCHAR *PWCHAR;

char与TCHAR相互转化

char与TCHAR相互转化 char strUsr[10] = "Hello"; TCHAR Name[100]; #ifdef UNICODE MultiByteToWideChar(CP_ACP, 0, strUsr, -1, Name, 100); #else strcpy(Name, strUsr); #endif TCHAR转char char* ConvertLPWSTRToLPSTR (LPWSTR lpwszStrIn) { LPSTR pszOut = NULL;