标签:字符 UNICODE 记录 TEXT 字符集 Unicode 使用 字节
宽字符与多字节字符
在windows系统中,Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。
Windows NT提供的两种方式分别是:Unicode字符集和多字节字符集。
一般我们会选择Unicode字符集,因为这样很方便我们开发,值得一提的是,Unicode字符集也许我们很熟悉,平时所说的宽字节就是Unicode,多字节就是指的ANSI,GB等。
宽字符和多字节字符的说明如下:(引用自网络)
宽字符,wide character,该字符集内每个字符使用相同的位长;
多字节字符,multibyte character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定。
在VS->属性->配置属性->高级->字符集选项中,我们也看到了这两种字符集。一般项目默认选择的是Unicode宽字符集。
当选择Unicode宽字符集时,我们可以看到实际的预处理器定义信息如下:(C/C++->所有选项->预处理器定义)
当改为多字节字符集,信息如下:
ANSI多字节编码与UNICODE宽字符编码区别
ANSI中的字符采用8bit,而UNICODE中的字符采用16bit。(对于字符来说ANSI以单字节存放英文字符,以双字节存放中文等字符,而Unicode下,英文和中文的字符都以双字节存放)Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容。
目前,在网络、Windows系统和很多大型软件中得到应用。8bit的ANSI编码只能表示256种字符,表示26个英文字母是绰绰有余的,但是表示汉字,韩国语等有着成千上万个字符的非西方字符肯定就不够了,正是如此才引入了UNICODE标准。
MS相关宏定义
L:用来告诉编译器该字符串一律作为Unicode来编译。它用来将ASNI转换为Unicode。
_T():一个宏。其根据编译器实际选择的字符集(宏定义)来进行灵活选择。如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,表示该字符(串)以宽字符表示。如果项目使用了ANSI多字节,则字符(串)就是其本身,用_T来保证兼容性。VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。
_TEXT():其与_T功能一样。
TEXT():需要在#include<WinNT.h>前加上#include <Windows.h>才能使用TEXT,TEXT是根据UNICODE来确定宏的。当编译环境使用Unicode字符集时,预编译宏包含了_UNICODE和UNICODE(上图中可以看到),所以_T(),_TEXT(),TEXT()三者在Unicode字符集功能是一样的。
具体的MS中宏定义信息如下:
T() ,_TEXT () 定义于tchar.h,在Windows.h下
//tchar.h #define _T(x) __T(x) #define _TEXT(x) __T(x) #ifdef _UNICODE #define __T(x) L ## x //第210行 #else #define __T(x) x //第858行 #endif
TEXT () : 在WinNT.h下
#define TEXT(quote) __TEXT(quote) #ifdef UNICODE #define __TEXT(quote) L##quote #else /* UNICODE */ #define __TEXT(quote) quote #endif /* UNICODE */
LPCTSTR,LPWSTR, PTSTR, LPTSTR,wchar_t区别
参考:https://blog.csdn.net/qq_22642239/article/details/84822485。
总结:
L:用来告诉编译器该字符串一律作为Unicode来编译。它用来将ASNI转换为Unicode。
_T、_TEXT、TEXT 三者功能一样。如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,表示该字符(串)以宽字符表示。如果项目使用了ANSI多字节,则字符(串)就是其本身,用_T来保证兼容性。
tchar.h是运行时的头文件,_T、_TEXT 根据_UNICODE来确定宏
winnt.h是Win的头文件根据,TEXT 根据UNICODE 来确定宏
_UNICODE宏用于C运行期头文件,UNICODE宏则用于Windows头文件.当编译源代码模块时,通常必须同时定义这两个宏。
标签:字符,UNICODE,记录,TEXT,字符集,Unicode,使用,字节 来源: https://www.cnblogs.com/shuzhongke/p/15341834.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。