[C/C++] PCWSTR LPCTSTR等等
乌拉~~~ 这是我第一百篇博文咯~
为什么会有这个
真的开发windows程序的时候会发现,各种字符指针好乱,正是因为被弄昏了头,所以才要记清楚。。。
尤其是发现 最开始学的strcmp()什么的都不好使了,有点乱
Windows的API到底好不好使。。。 一眼看上去真的很恐怖,但是实际上真的已经比较友好了。。
参考: https://blog.csdn.net/gaoyang610/article/details/21234979
先看这个LPCWSTR
、LPCSTR
、LPCTSTR
- L: 表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
- P: 表示这个是个指针,,所以这个“字符串”实际上不占用堆空间
- C: 指的是const,是个常量
- T: 表示在win32环境中,有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
- STR: 表示这是个字符串
- W: Wide宽字符
所以就可以解释为
- LPCWSTR: 是一个指针,是个常量,并且是宽型(Wide)字符串,与
const wchar_t*
等效 - LPCTSTR: 是一个指针,也是常量,等效于
const TCHAR*
L"" 宏
L"Hello",表示"Hello"是一个Unicode字符串
直接用""包裹的字符串是ANSI编码的字符串
当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
from: https://baike.baidu.com/item/TCHAR/1865865
LPCWSTR字符串比较
if (!_wcsicmp(lpName, pe.szExeFile))
{
return pe.th32ProcessID;
}
越看越乱
wchar_t 和 char 之间转换
from: https://www.cnblogs.com/vranger/p/3792791.html
使用函数 WideCharToMultiByte(),此函数把宽字符串转换成指定的新的字符串,如ANSI 等,新字符串不必是多字节字符集。
wchar_t* pwszUnicode = L"Holle"; //wcslen(pwsUnicode)=5
int iSize;
char* pszMultiByte;//返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0'
iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL); //iSize =wcslen(pwsUnicode)+1=6
pszMultiByte = (char*)malloc(iSize*sizeof(char)); //不需要 pszMultiByte = (char*)malloc(iSize*sizeof(char)+1);
WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
使用函数 MultiByteToWideChar(),此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。
char* pszMultiByte = "Holle"; //strlen(pwsUnicode)=5
int iSize; wchar_t* pwszUnicode ;
//返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0'
iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte , -1, NULL, 0); //iSize =wcslen(pwsUnicode)+1=6
pwszUnicode = (wchar_t *)malloc(iSize*sizeof(wchar_t)); //不需要 pwszUnicode = (wchar_t *)malloc((iSize+1)*sizeof(wchar_t))
MultiByteToWideChar(CP_ACP, 0, pszMultiByte , -1, pwszUnicode , iSize);
关于 ANSI编码
经过百度可以知道,ANSI并不是指的某一个编码,在不同国家的windows中ANSI是不同的字符集,比如说在中国ANSI == GBK,但是在日本就是另一种字符集了。