huolong blog

Windows编程中的Unicode问题

Windows操作系统内核对Unicode的支持

Windows操作系统内核中的字符表示为UTF-16小尾序,可以正确处理、显示以4字节存储的字符。但是Windows API实际上仅能正确处理UCS-2字符,即仅以2字节存储的,码位小于U+FFFF的Unicode字符。其根源是Microsoft C++语言把wchar_t数据类型定义为16比特的unsigned short,这就与一个wchar_t型变量对应一个宽字符,可以存储一个Unicode字符的规定相矛盾。相反,Linux平台的GCC编译器规定一个wchar_t是4字节长度,可以存储一个UTF-32字符,宁可浪费了很大的存储空间。

windows编程中L,_T() ,TEXT和_TEXT的使用及其区别

其实一句话概括的话,其实没有区别。字符串(literal string)前面的大写字母L,用来告诉编译器该字符串应该作为Unicode来编译。它用来将ASNI转换为Unicode。 tchar.h中定义如下:

  1. #define _T(x)       __T(x)  
  2. #define _TEXT(x)    __T(x)  
  3.   
  4. #ifdef  _UNICODE  
  5. #define __T(x)      L ## x     
  6. #else  
  7. #define __T(x)      x         
  8. #endif  

winnt.h中定义如下:

  1. #define TEXT(quote) __TEXT(quote)   
  2.   
  3. #ifdef  UNICODE                       
  4. #define __TEXT(quote) L##quote        
  5. #else   /* UNICODE */                 
  6. #define __TEXT(quote) quote           
  7. #endif /* UNICODE */  

可以看到tchar.h是运行时的头文件,_T、_TEXT 根据_UNICODE来确定宏 winnt.h是Win的头文件根据,TEXT 根据UNICODE 来确定宏

如果需要同时使用这3个宏,则需同时定义 UNICODE 和 _UNICODE_