[C/C++] PCWSTR LPCTSTR等等

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。[C/C++] PCWSTR LPCTSTR等等,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

为什么会有这个

真的开发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.bmabk.com/index.php/post/225577.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!