Unicode的全部字符都占用两个字节。
1.C运行库对Unicode的支持
在string.h中定义了一个wchar_t类型代替char类型来支持Unicode字符串:
typedef unsigned short wchar_t;
在string.h中定义了一些以wcs开头的函数来支持Unicode,下面前面为ANSI C字符串函数,后面为Unicode函数:
char *strcat(char *,const char *);
wchar_t *wcscat(wchar_t *,const wchar_t *);
char *strchar(char *,const char *);
wchar_t *wcschr(wchar_t *,const wchar_t *);
char *strcmp(char *,const char *);
wchar_t *wcscmp(wchar_t *,const wchar_t *);
char *strlen(char *,const char *);
wchar_t *wcslen(wchar_t *,const wchar_t *);
可以运用头文件TChar.h建立单个源代码文件,使用特定的宏,通过判断是否定义了_UNICODE,来将这些宏扩展为ANSI版本的函数或UNICODE版本的函数。如果需要定义一个字符,使用TCHAR类型。如果定义了_UNICODE,那么THCAR声明为如下形式:
typedef wchar_t TCHAR;
如果没有定义_UNICODE,那么TCHAR会声明为如下形式:
typedef char TCHAR;
定义字符数组如下:
TCHAR szString[100];
如果需要将字符串字面值定义为UNICODE,那么可以在字符串前加上大写字母L,例如:
TCHAR *pt=L"mystring";
但是有时候,我们希望系统能够通过是否定义_UNICODE来智能的将字符串翻译为ANSI或UNICODE类型,那么可以使用宏_TEXT。如果定义了_UNICODE,那么宏定义形式如下:
#define _TEXT(x) L ## x
如果没有定义_UNICODE,那么宏_TEXT定义如下形式:
#define _TEXT(x) x
因此,上面可改为:
TCHAR *pt=_TEXT("mystring");
2.windows定义的UNICODE数据类型
在windows中定义的UNICODE数据类型如下:
数据类型 | 说明 |
WCHAR | 用于定义UNICODE字符 |
PWSTR | 指向UNICODE字符串的指针 |
PCWST | 指向一个恒定的UNICODE字符串的指针 |
windows头文件中也定义了ANSI/UNICODE通用的数据类型PTSTR和PCTSTR,通过判断是否定义了UNICODE宏,来指定PTSTR和PCTSTR的字符集类型。注意这里UNICODE宏没有下划线。_UNICODE宏用于C运行期头文件,UNICODE宏用于windows头文件。
3.windows中的ANSI函数和UNICODE函数
windows中的函数一般都有ANSI版本的函数和UNICODE版本的函数。ANSI版本版本的函数后面以A字母结束,如CreateWindowExA;UNICODE版本的函数以W结束,如CreateWindowExW。
在windows中提供了一些字符串操作系统函数,如StrCat、StrChr、StrCmp、StrCpy等,这些函数都有ANSI和UNICODE版本的函数,如StrCatA何StrCatW,可以通过判断是否使用了UNICODE宏来具体这些函数。要使用这些函数,要包含头文件ShlWApi.h。
4.windows字符串函数
函数 | 说明 |
CharLower | 转换成大写字符串 |
CharUpper | 转换成小写字符串 |
CharLowerBuff | 转换成大写字符串 |
CharUpperBuff | 转换成小写字符串 |
IsCharAlpha | 判断是否是字母 |
IsCharAlphaNumeric | 判断是否是字母和数字 |
IsCharLower | 判断是否死小写字母 |
IsCharUpper | 判断是否是大写字母 |
MutilByteToWideChar | 将多字节字符串转换成宽字符串 |
WideCharToMutilByte | 将宽字符串转换成多字节字符串 |