[C/C++] PCWSTR LPCTSTR等等

乌拉~~~ 这是我第一百篇博文咯~

为什么会有这个

真的开发windows程序的时候会发现,各种字符指针好乱,正是因为被弄昏了头,所以才要记清楚。。。

尤其是发现 最开始学的strcmp()什么的都不好使了,有点乱

Windows的API到底好不好使。。。 一眼看上去真的很恐怖,但是实际上真的已经比较友好了。。

参考: https://blog.csdn.net/gaoyang610/article/details/21234979

先看这个LPCWSTRLPCSTRLPCTSTR

  • 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,但是在日本就是另一种字符集了。

原文链接: https://www.cnblogs.com/cjdty/p/13166080.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    [C/C++] PCWSTR LPCTSTR等等

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/199219

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午8:04
下一篇 2023年2月12日 下午8:04

相关推荐