VS中字符集的Unicode和多字节字符集的区别

浪子不回头ぞ 提交于 2019-12-10 16:51:28

VS中字符集的Unicode和多字节字符集的用处,注意是 用处
所以不赘述具体编码方式。网上一大片。

ANSI编码(使用""包裹)
Unicode编码(使用L""包裹)

----------------------------------------------------------------------------------------------------------------

1

Winodows API有两种,一种W结尾,一种A结尾。
W结尾API,对应Unicode字符集。
A结尾API,对应ANSI多字节字符集。

1.VS新建工程,在主函数里随便输入个Win32API,例如“CreateProcess()”
2.设置字符集为多字节字符集
3.F12查看“CreateProcess()”函数定义,如下:
#ifdef UNICODE
#define CreateProcess  CreateProcessW
#else
#define CreateProcess  CreateProcessA
#endif // !UNICODE
//CreateProcessA会高亮,表示ANSI版本
//“CreateProcess()”所映射到的函数会根据所设置的字符集自动选择,当然,也可以手动选择使用哪个版本的函数。
4.设置为Unicode字符集,CreateProcessW()会变为高亮,表示使用宽字符版本,他们所使用的参数有所区别,W版本必须使用宽字符,如wchar_t、std::wstring。

----------------------------------------------------------------------------------------------------------------

2

在Win32API中,其参数大多形如LPSTR、LPCSTR、LPWSTR、LPCWSTR、LPTSTR、LPCTSTR等。

它们是Win32和VC++所使用的一种字符串数据类型。其实
LP:指针
C:const
W:wide宽字符
T:表示在Win32环境中, 有一个_T宏,通用
STR:表示这个变量是一个字符串

因为受字符集的影响,所以需要区分是否使用宽字符,因此使用T宏来自动推断使用哪一种类型。

常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。

----------------------------------------------------------------------------------------------------------------

3

LPCTSTR
#ifdef UNICODE
#define LPCTSTR LPCWSTR
#else
#define LPCTSTR LPCSTR
#endif

TCHAR
当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
当我们定义了UNICODE宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHAR就会摇身一变,变成了wchar_t。

----------------------------------------------------------------------------------------------------------------

4

参考:

https://bbs.csdn.net/topics/70298966
https://blog.csdn.net/stephen1315/article/details/7476236
https://baike.baidu.com/item/TCHAR/1865865?fr=aladdin
https://blog.csdn.net/w343051232/article/details/7083276

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!