1,字符编码
UTF-8:(Unicode Transformation Format (Unicode转换格式))
0x0080 以下的字符压缩为1个字节
0x0080~0x07FF 之间的字符转换成2个字节
0x0800 以上的字符转换为3个字节
代理对(surrogate pair)被写为4个字节。
UTF-16:
UTF-32:
每个字符都编为4个字节。
编码算法简单,但是保存文件和网络传输效率低,一般用于应用程序内部。
Unicode 字符集和字母表
6位代码 字符 16位代码 字母/书写符号
0000~007F ASCII 0300~036F 常见的变音符号
0080~00FF 西欧语系字母 0400~04FF 西里尔字母
0100~017F 欧洲拉丁字母 0530~058F 亚美尼亚文
0180~01FF 扩充拉丁字母 0590~05FF 希伯来文
0250~02AF 标准音标 0600~06FF 阿拉伯文
02B0~02FF 进格修饰字母 0900~097F 梵文字母
2,ANSI字符和UNICODE字符与字符串数据类型
8位ANSI字符 char
16位 UNICODE字符 wchar_t
在<tchar.h>中有 typedef unsigned short wchar_t;
声明UNICODE字符和字符串的方法:
Wchar_t c=L'A';
Wchar_t szBuffer[100]=L"A String";
L通知编译器该字符为UNICODE
<winnt.h>中有如下定义:
Typedef char CHAR;
Typedef wchar_t WCHAR;
Typedef CAHR * PCHAR;
Typedef CHAR * PSTR;
Typedef CONST CHAR * PCSTR;
Typedef WCHAR * PWCHAR;
Typedef WCHAR * PWSTR;
Typedef CONST WCHAR * PCWSTR;
另外一个可以自己再研究的问题:(头部注解)
Typedef __nullterminated WCHAR * NWPSTR,* LPWSTR,* PWSTR;
#ifdef UNICODE
Typedef CONST WCHAR * PCTSTR;
#define __TEXT(quote) quote //r_winnt
#define __TEXT(quote) L##quote
/*关于##的内容:http://hi.baidu.com/luosiyong/blog/item/266b8031e456c6ae5edf0ee8.html */
#else
Typedef CHAR TCHAR,* PTCHAR,PTSTR;
Typedef CONST CHAR * PCTSTR;
#define __TEXT(quote) quote
#endif
#define TEXT(quote) __TEXT(quote)
使用:TCHAR szBuffer[100]=TEXT("A String");
3,Windows中的Unicode函数和ANSI函数
如:(注意函数结尾的W和A) 调用的时候没有,内部定义
HWND WINAPI CreateWindowExW();
HWND WINAPI CreateWindowExA();
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW //代表宽字节函数
#else
#define CreateWindowEx CreateWindowExA //代表ANSI函数
#endif
4,C运行库中的Unicode函数和ANSI函数
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
_UNICODE和UNICODE,C运行库始终会为它们加下划线前缀的。
5,C运行库中的安全字符串函数
为了防止缓冲区溢出等一系列问题,windows采取了一些措施。
PTSTR _tcscpy(PTSTR strDestination,PCTSTR strSource);
Errno_t _tcscpy_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);
PTSTR _tcscat(PTSTR strDestination,PCTSTR strSource);
Errno_t _tcscat_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);
这两个函数的第二个版本都带有_s(secure)后缀,都带有缓冲区的大小,是字符数,而不是sizeof关系,应该用_countof宏(stdlib.h)得到。
6,处理字符串的更多控制
HRESULT StringCchCat(PTSTR pszDest,size_t cchDest,PCTSTR pszSrc);
HRESULT StringCchCatEx(PTSTR pszDest,sze_t cchDest,PCTSTR pszSrc,PTSTR * ppszDestEnd,size_t * pcchRemaining,DWORD dwFlags);
HRESULT StringCchCopy(PTSTR pszDest,size_t cchDest,PCTSTR pszSrc);
HRESULT StringCchCopyEx(PTSTR pszDest,sze_t cchDest,PCTSTR pszSrc,PTSTR * ppszDestEnd,size_t * pcchRemaining,DWORD dwFlags);
HRESULT StringCchPrintf(PTSTR pszDest,size_t cchDest,PTSTR pszFormat,...);
HRESULT StringCchPrintfEx(PTSTR pszDest,size_t cchDest,PTSTR * ppszDestEnd,size_t * pcchRemaining,DWORD dwFlags,PCTSTR pszFormat,...);
Cch 表示 Count of characters 字符数 _countof 宏得到
另外有:
StringCbCat(Ex)
StringCbCopy(Ex)
StrigCbPrintf(Ex)