一、Unicode简介
1、Unicode扩展自ASCII字符集。在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每有8位宽;而Unicode使用全16位字符集。其实也就是一个宽字符集。
2、在char中一个变量只能保存一个ASCII字符,但是一个char指针可以保存多个,和数据char一样,最后一个字符是用来保存/0的。
3、C中的宽字符基于wchar_t数据型态,它在几个表头文件包括了WCHAR.H
Typedef unsigned short wchar_t;这是一个16位宽字符,也是Unicode。
Wchar_t *p=L”Hello!”紧接在第一个引号前面的大写字母L(long)这将告诉编译器该字符串按宽字符保存即占用
2
个字节。
4、得到宽字符的长度:
ASCII的字符串长度:
char *pc=”Hello!”;iLength=strlen(pc);这里的iLength等于6也就是字符数。
UniCode字符串长度:
Wchar_t *pw=L”Hello!”;iLength=strlen(pw);iLenght等于1这是因为”hello!”的字符占用16位:0x0048(H) 0x0065(e)……处理器在内存中存为:48 00 65 00…..strlen是读到00表示结束所有只有一位!
在这里我们就要用到计算宽字符的strlen即wcslen(wide-character string length)并且在STRING.H和WCHAR.H中均有说明。Strlen函数说明如下:
Size_t__cdecl strlen(const char*);
Size_t__cdecl wcslen(const wchar_t*);这样我们就可以用iLenght=wcslen(pw)来计算其长度了结果为6改成宽字节后,字符串的字符长度不改变,只是位数长度改变了。
所有带有字符串参数的C执行链接库函数都有宽字符版。Printf的宽字符版是wprintf,这些函数在WCHAR.H和含有标准函数说明的表头文件中说明。
二、单一原始码:
(
tchar.h
)
宽字符执行时期链接库中的函数比常规的函数大,所以要用两个版本的程序来处理ASCII和Unicode字符串,
即能处理
ASCII
又能处理
Unicode
的代码就是单一原始码文件。
1、 用TCHAR.H表头文件。不是ANST C标准的部分所以定义的每个函数和宏定义的前面都有一个底线。TCHAR.H为需要字符串参数的标准执行链接库函数提供了一系列的替代名称。
2、 在这里我们用的单一原始码是
_tcslen这个函数是在ASCII和Unicode中自己识别是否是用strlen还是用wcslen在什么情况下_tcslen是strlen什么时候是wcslen?
Strlen(ASCII
字符长度
)
,
wcstrlen(UNICODE
字符长度
)
,
_tcslen(
多型态字符长度)
,
tchar(
多型态字符类型)
,
wchar_t(
字符类型
)
,
char(
字符类型
)
的不定时态:
如果定义了名为
_UNICODE
的标识符,并且程序中包含了
TCHAR.H
表头文件,那么
_tcslen
就定义为
wcslen
:
#define _tcslen strlen
如果没有定义
UNICODE
,则
_tcslen
定义为
strlen
:
#define _tcslen wcslen
TCHAR.H
还用一个新的数据型态
TCHAR
来解决两种字符数据型态的问题。如果定义了
_UNICODE
标识符,那么
TCHAR
就是
wchar_t
:
Typedef wchar_t TCHAR;
否则,
TCHAR
就是
char
Typedef char TCHAR;
3、 字符串前的L处理:
如果定义了_UNICODE标识符,那么一个称作_T的宏就定义如下:
#define _T(X) L##x
//这是合乎ANSI C标准的前置处理器规范
如:_T(“hello”)--
àL”hello”
如果没有定义了_UNICODE那么_T就定义成如下:
#define _T(X) x
此外还有两个和_T想同的宏定义:
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
4、 Windows表文件类型:
WINNT.H定义了新的数据形态,称作CHART和WCHAR
typedef char CHAR;
typedef char CHAR;
Typedef wchar_t WCHAR;//wc
当您需要定义8位或者16位字符时,推荐您用CHAR和WCHAR,用到了WCHAR的变量时前面要加入wc匈牙利标记法。
5、8位CHAR字符串指针和const 8位字符串指针的数据形态
typedef CHAR *PCHAR,*LPCH,*PCH,*NPSTR,*LPSTR,*PSTR;
typedef CONST CHAR *LPCCH,*PCCH,*LPCSTR,*PCSTR;
6、16位WCHAR字符串指针和const WCHAR 字符串指针
typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR;
typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR
以上的几种数据类型都是为了兼容以前16位系统的near和long指针而用的。
7、
#ifdef UNICODE
Typedef WCHAR TCHAR,*PTCHAR;
Typedef LPWSTR LPTCH,PTCH,PTSTR,LPTSTR;
Typedef LPCWSTR LPCTSTR;
#else
Typedef char TCHAR,*PTCHAR;
Typedef LPSTR LPTCH,PTCH,PTSTR,LPTSTR;
Typedef LPCSTR LPCTSTR;
#endif
8、
如果你希望明确定义
8
位字符变量和字符串,可以使用
CHAR,PCHAR
以及带引号的字符串。为明确地使用
16
位字符变量和字符串,可以使用
WCHAR,PWCHAR
并将
L
添加到引号前面。对
于
8
位还是
16
位取决于
UNICODE
标识符的定义的变量或字符串,可以使用
TCHAR,PTCHAR
和
TEXT
宏。
三、Windows函数调用:
1、MessageBox的用法:
WINUSERAP int WINAPI MessageBoxA(HWND hWnd,
LPCSTR lpText,LPCSTR lpCaptiopn,
//两个是8位的字符串
UINT uType);
WINUSERAPI int WINAPI MessageBoxW (HWND hWnd,
LPCWSTR lpText, LPCWSTR lpCaption,//两个是16位字符串
UINT uType);
MessageBox的多形态:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
这样,如果定义了
UNICODE
标识符,那么程序中所有的
MessageBox
函数呼叫实际上就是
MessageBoxW
函数;否则就是
MessageBoxA
函数。
2、在windows定义的一组字符串函数,这些函数用来计算字符串长度,复制字符串,
连接字符串和比较字符串:
iLength=lstrlen(pString);
pString=lstrcpy(pString1,pString2);
pString=lstrcpyn(pString1,pString,iCount);
pString = lstrcat (pString1, pString2) ;
iComp = lstrcmp (pString1, pString2) ;
iComp = lstrcmpi (pString1, pString2) ;
这些函数与C链接库中对应的函数功能相同。如果定义了UNICODED标识符,那么这些函数将接受宽字符串,否则只接受常规字符串。宽字符串版的lstrlenW函数可在windows98中用!
3、printf在windows中的应用
|
ASCII
|
宽字符
|
常规
|
参数的变数个数
|
|
|
|
标准版
|
sprintf
|
swprintf
|
_stprintf
|
最大长度版
|
_snprintf
|
_snwprintf
|
_sntprintf
|
Windows
版
|
wsprintfA
|
wsprintfW
|
wsprintf
|
参数数组的指针
|
|
|
|
标准版
|
vsprintf
|
vswprintf
|
_vstprintf
|
最大长度版
|
_vsnprintf
|
_vsnwprintf
|
_vsntprintf
|
Windows
版
|
wvsprintfA
|
wvsprintfW
|
wvsprintf
|