一 Unicode 简介
1 Unicode 是ASCII 扩展,从传统的7位,扩展位16 位,可以显示世界上所有语言
ASCII 码
0- 1- 2- 3- 4- 5- 6- 7-
-0 NUL DLE SP 0 @ P ` p
-1 SOH DC1 ! 1 A Q a q
-2 STX DC2 " 2 B R b r
-3 ETX DC3 # 3 C S c s
-4 EOT DC4 $ 4 D T d t
-5 ENQ NAK % 5 E U e u
-6 ACK SYN & 6 F V f v
-7 BEL ETB ' 7 G W g w
-8 BS CAN ( 8 H X h x
-9 HT EM ) 9 I Y I y
-A LF SUB * : J Z j z
-B VT ESC + ; K [ k {
-C FF FS , < L \ l |
-D CR GS - = M ] m }
-E SO RS . > N ^ n ~
-F SI US / ? O _ o DEL
2 双位字符集
DBCS:double-byte character set,最初的128个代码是ASCII,较高的128个代码中的某些总是跟随著第
二个位元组。这两个位元组一起(称作首位元组和跟随位元组)定义一个字元。
3 Unicode 解决方案
Unicode是统一的16位元系统,也DBCS 这样的同时含有一位和两位的字符集不同,Unicode 可以表示
65536 个字符。
Unicode 的缺点是,Unicode 使用的空间是ASCII 的两倍
二 宽字符和c
1 char
char c='A';
变量c 用一个字节来存储,用16 进制表示位0x41
char * p;
32 位系统,一次指针变量需要用4个字节表示
char * p="Hello!";
字符串占用7个字节 其中 6个用于保存字符串,1个用于保存中止符号0
char [10]
占用10个字节
char a[]="Hello!";
占用 7个字节
2 宽字节
typedef unsigned short whcar_t which is define in the window.h
与unsign short 一样 为16 字节,两个字节
wchar_t c='A' 0x0041
wchar_t *p=L"Hello!" 指针占用 4个字节 而 字符串占用 14 个字节
3 宽字元程序库函数
char * pc = "Hello!" ;
iLength = strlen (pc) ;
wchar_t * pw = L"Hello!" ;
iLength = wcslen (pw) ;
4 维护单一原始码
Microsoft Visual C++包含的TCHAR.H
如果定义了名为_UNICODE的识别字,并且程式中包含了TCHAR.H表头档案,那么_tcslen就定义为wcslen
#define _tcslen wcslen
如果没有定义UNICODE,则_tcslen定义为strlen:
#define _tcslen strlen
如果定义了 _UNICODE识别字,那么TCHAR就是wchar_t:
typedef wchar_t TCHAR ;
否则,TCHAR就是char:
typedef char TCHAR ;
如果没有定义_UNICODE识别字
#define __T(x) x
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
三 宽字节和windows
1 window 头文件中的类型
typedef char CHAR ;
typedef wchar_t WCHAR ;
typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;
typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;
typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;
#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
2 Windows 函数调用
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
3 Windows 的字符函数
ILength = lstrlen (pString) ;
pString = lstrcpy (pString1, pString2) ;
pString = lstrcpyn (pString1, pString2, iCount) ;
pString = lstrcat (pString1, pString2) ;
iComp = lstrcmp (pString1, pString2) ;
iComp = lstrcmpi (pString1, pString2) ;
4 在windows 使用printf
windows 并不支持printf 但是可以使用sprintf
int printf (const char * szFormat, ...) ;
printf ("The sum of %i and %i is %i", 5, 3, 5+3) ;
int sprintf (char * szBuffer, const char * szFormat, ...) ;
char szBuffer [100] ;
sprintf (szBuffer, "The sum of %i and %i is %i", 5, 3, 5+3) ;
puts (szBuffer) ;