VC++中字符串编码处理的一些相关问题

前言

什么是tchar?

百度百科对其的定义如下“:

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

微软将这两套字符集及其操作进行了统一,通过条件编译(通过_UNICODE和UNICODE宏)控制实际使用的字符集,这样就有了_T("")这样的字符串,对应的就有了_tcslen这样的函数
为了存储这样的通用字符,就有了TCHAR:
当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
当我们定义了UNICODE宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHAR就会摇身一变,变成了wchar_t。而未定义UNICODE宏时,TCHAR摇身一变,变成了unsignedchar。这样就可以很好的切换宽窄字符集。
tchar可用于双字节字符串,使程序可以用于中日韩等国 语言文字处理、显示。使编程方法简化。
winnt.h头文件
微软提供的头文件,自定义了许多windows环境下可能需要用到的宏和数据结构。

一._T 宏定义

该宏定义位于tchar.h头文件中,定义如下:

#define _T(x)       __T(x)

_T宏的作用

_T宏用于处理被引号包括的字符串常量,编译器会根据当前编译环境选择合适的字符处理方式(Unicode、ANSI等) 处理该字符串常量。
 如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。 
 如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD" 。
TEXT,_TEXT 等宏定义同理。
如下面三语句:   

  TCHAR  Str1[]   =   TEXT("str1");   
  char   Str2[]   =   "str2";   
  WCHAR  Str3[]   =   L("str3");    

  第一行代码在定义了UNICODE时等价于第三行代码,没有则等于第二行。   
  但前两行代码无论是否定义了UNICODE都是生成一个ANSI字符串,而第三行代码总是生成UNICODE字符串。   
  为了程序的可移植性,建议都用第一种表示方法。   
  但在某些情况下,如果某个字符必须为ANSI或UNICODE,那就用后两种方法。

二、LPCSTR等类型

位于winnt.h头文件下
L表示long指针
P表示这是一个指针
C表示是常量const
STR表示这个变量是一个字符串

LPCSTR     32-bit   指针,指向一个常量字串   
LPSTR        32-bit   指针,指向一个字串   
LPCTSTR   32-bit   指针,指向一个常量字串。此字串可移植到Unicode   和DBCS   
LPTSTR      32-bit   指针,指向一个字串。此字串可移植到Unicode   和DBCS

参考资料

TCHAR相关

原文地址:https://www.cnblogs.com/0kk470/p/7837467.html