zoukankan      html  css  js  c++  java
  • VC++中字符串编码处理的一些相关问题

    前言

    什么是tchar?

    百度百科对其的定义如下“:

    因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wcslen,分别用于处理两种字符串

    微软将这两套字符集及其操作进行了统一,通过条件编译(通过_UNICODE和UNICODE宏)控制实际使用的字符集,这样就有了_T("")这样的字符串,对应的就有了_tcslen这样的函数
    为了存储这样的通用字符,就有了TCHAR:
    当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
    当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
    当我们定义了UNICODE宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHAR就会摇身一变,变成了wchar_t。而未定义UNICODE宏时,TCHAR摇身一变,变成了unsignedchar。这样就可以很好的切换宽窄字符集。
    tchar可用于双字节字符串,使程序可以用于中日韩等国 语言文字处理、显示。使编程方法简化。
    winnt.h头文件
    微软提供的头文件,自定义了许多windows环境下可能需要用到的宏和数据结构。

    一._T 宏定义

    该宏定义位于tchar.h头文件中,定义如下:

    #define _T(x)       __T(x)
    

    _T宏的作用

    _T宏用于处理被引号包括的字符串常量,编译器会根据当前编译环境选择合适的字符处理方式(Unicode、ANSI等) 处理该字符串常量。
     如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。 
     如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD" 。
    TEXT,_TEXT 等宏定义同理。
    如下面三语句:   

      TCHAR  Str1[]   =   TEXT("str1");   
      char   Str2[]   =   "str2";   
      WCHAR  Str3[]   =   L("str3");    

      第一行代码在定义了UNICODE时等价于第三行代码,没有则等于第二行。   
      但前两行代码无论是否定义了UNICODE都是生成一个ANSI字符串,而第三行代码总是生成UNICODE字符串。   
      为了程序的可移植性,建议都用第一种表示方法。   
      但在某些情况下,如果某个字符必须为ANSI或UNICODE,那就用后两种方法。

    二、LPCSTR等类型

    位于winnt.h头文件下
    L表示long指针
    P表示这是一个指针
    C表示是常量const
    STR表示这个变量是一个字符串

    LPCSTR     32-bit   指针,指向一个常量字串   
    LPSTR        32-bit   指针,指向一个字串   
    LPCTSTR   32-bit   指针,指向一个常量字串。此字串可移植到Unicode   和DBCS   
    LPTSTR      32-bit   指针,指向一个字串。此字串可移植到Unicode   和DBCS

    参考资料

    TCHAR相关

  • 相关阅读:
    Python 获取学校图书馆OAPC账号对应的身份证号码
    利用Python获取ZOJ所有题目的名字
    android wifi Beacon帧解析
    比较skb_clone和skb_cpoy
    查找链表的中间节点
    linux wifi wpa_cli及hostapd_cli命令总结
    android wifi I2C总线
    android wifi P2P CONNECT, INVITE和JOIN流程选择
    android wifi ANR问题分析总结
    android 编译代码注意事项
  • 原文地址:https://www.cnblogs.com/0kk470/p/7837467.html
Copyright © 2011-2022 走看看