zoukankan      html  css  js  c++  java
  • _T、_TEXT、TEXT、L的使用记录

    宽字符与多字节字符

    在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头文件.当编译源代码模块时,通常必须同时定义这两个宏。

  • 相关阅读:
    手写排序
    cookie与session的区别
    索引有几种
    mysql优化怎么做?
    laravel Builder scope count() 出错 Eloquent/Builder.php 1185行
    鹏业软件喷淋的喷头改为上喷
    鹏业安装算量复制工程量
    鹏业软件安装算量计算规则,喷淋识别、以及保温设置的问题解决
    鹏业安装算量喷淋管件修改问题解答
    鹏业软件CAD云服务转图纸没反应的说明
  • 原文地址:https://www.cnblogs.com/shuzhongke/p/15341834.html
Copyright © 2011-2022 走看看