- 宽节节
宽字节不需要Unicode.Unicode是一种可能的宽字符编码.ANSI C也支持多字节字符集.
C中的宽字符基于wchar_t数据类型 typedef unsigned short wchar_t (无符号短整型,16位宽)
wchar_t * p=L"Hello";
static wchar_t a[]=L"Hello";
L代表 long
但
wchar_t c=L'A';
这里的L通常是不必要的.编译器无论如何会对该字符进行零扩充
计算字符串长度时strlen(const char *) 对应的宽字节版本函数为wcslen(const wchar_t *)
- 维护单一源码
一系列的宏皆为维护既能按ASCII编译又能按Unicode编译的单一代码文件.
TCHAR.H头文件定义如下宏:
如果定义了 _UNICODE标识符
typedef wchar_t TCHAR
反之
typedef char TCHAR
#define __T(x) L##x
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
用_T(x)宏来定义字符串文字,根据_UNICODE的标识符,将字符串解释为宽字符的组合或8位的字符
如c运行库中计算字符串长度时strlen(const char *),wcslen(const wchar_t *)
windows字符串函数为:
int lstrlen(
LPCTSTR lpString );
LPCTSTR lpString );
LPCTSTR的定义:
winbase.h中
#ifdef UNICODE // r_winnt
#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPWCH LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPUWSTR PUTSTR, LPUTSTR;
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
typedef LPWSTR LP;
#define __TEXT(quote) L##quote // r_winnt
#else /* UNICODE */ // r_winnt
#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPCH LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
#define __TEXT(quote) quote // r_winnt
#endif /* UNICODE */ // r_winnt
#define TEXT(quote) __TEXT(quote) // r_winnt