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_