关于Windows系统下编程之字符处理
Unicode字符集提供了简单而有一致的表示字符串的方法,它规定字符串中每一个字符编码都是16位(两个字节)。所以利用Unicode字符集可以编码216 = 65535个字符。这样,它就能够对世界各国的书面文字中的所有字符进行编码,远远超过了单字节字符集的2 5 6 个字符的数目。
1 6 位代码
|
字符
|
16 位代码
|
字符
|
0 0 0 0 - 0 0 7 F
|
A S C I I
|
0 3 0 0 - 0 3 6 F
|
通用区分标志
|
0 0 8 0 - 0 0 F F |
拉丁文
1 字符
|
0 4 0 0 - 0 4 F F |
西里尔字母
|
0 1 0 0 - 0 1 7 F
|
欧洲拉丁文
|
0 5 3 0 - 0 5 8 F
|
亚美尼亚文
|
0 1 8 0 - 0 1 F F |
扩充拉丁文
|
0 5 9 0 - 0 5 F F |
西伯莱文
|
0 2 5 0 - 0 2 A F |
标准拼音
|
0 6 0 0 - 0 6 F F |
阿拉伯文
|
0 2 B 0 - 0 2 F F |
修改型字母
|
0 9 0 0 - 0 9 7 F
|
梵文
|
typedef unsigned short wchar_t;
eg:wchar_t szBuffer[100] ;//在内存中的大小为100*18bit = 200 byte。可以存储最多为9 9 个字符的Unicode字符串和一个结尾为零的字符
eg:char * strcat(char *,const char *);
char_t * wcscat(wchar_t *,const wchar_t *)
char * strchr(const char *,int);
wchar_t * wcschr(const wchar_t *,wchar_t);
int strcmp(const char *,const char *);
int wcscmp(const wchar_t *,const wchar_t *);
char * strcpy(char *,const char *);
wchar_t * wcscpy(wchar_t *,const wchar_t *);
size_t strlen(const char *);
size_t wcslen(const wchar_t *);
A WCHAR if UNICODE is defined, a CHAR otherwise
注意:TCHAR ch = “Hello”这行代码在Visual C++中,如果没有定义_UNICODE,编译是按ANSI编码,可以通过(在VC中默认是ANSI编码)。但当我们定义了_UNICODE时,编译就通不过,我们必须改成TCHAR ch = L“Hello”。字符串(literal string )前面的大写字母L ,用于告诉编译器该字符串应该作为Unicode字符串来编译。当编译器将字符串置于程序的数据部分中时,它在每个字符之间分散插入零字节。这种变更带来的问题是,现在只有当定义了_UNICODE时,程序才能成功地进行编译。我们需要另一个宏,以便有选择地在字符串的前面加上大写字母L 。这项工作由_TEXT宏来完成,_TEXT宏也在T C h a r. h 文件中做了定义。
#define _TEXT(x) x
所以使用该宏,可以改写上面这行代码为TCHAR ch = _TEXT(“Hello”),这样,无论是否定义了_UNICODE宏,它都能够正确地进行编译。
③Windows定义的Unicode数据(This type is declared in WinNT.h)
Typedef wchar_t WCHAR; //16-bit Unicode Characters
Typedef WCHAR *PWSTR;//Pointer to a new null-terminated //string of 16-bitUnicode characters
Typedef CONST WCHAR *PCWSTR;//Pointer to a constant //null-terminated string of //16-bit Unicode characters
A PWSTR if UNICODE is defined, a PSTR otherwise
#ifdef UNICODE
#else
typedef LPSTR PTSTR;
A PCWSTR if UNICODE is defined, a PCSTR otherwise.