对于Windows编程,几乎所有的API函数都提供了两种版本 ***A 和***W,前者是采用 ANSI编码来处理字符串,后者采用的是 Unicode.
在学习C/C++的时候,我们使用的大都是ANSI编码的函数,而Windows处于国际化标准的原因,内部采用了Unicode编码。这对于我们从ANIS C++转换到Windows的VC造成了困难。于是我认为,学习字符串处理,编码转换是学好Windows编程的基础。
以下作一个简单的介绍:
一,字符编码
目前使用的编码主要为以下三种:
1,UTF-8(即多字节)
UTF-8将一些特殊字符编码为1个字节,一些字符编码为2个字节,一些为3个字节,甚至还有少数为4个字节。
值在0x0080以下的字符压缩为1个字节,这对老美非常适用。
值在0x0080到0x07FF之间的字符转换为2个字节,这对欧洲地区非常适合。
值在0x0800以上的字符都转换为3个字节。适合东亚地区的语言。
最后,代理对(surrogate paid)编码为4个字节。
2,UTF-16(即Unicode字符采用的编码方式)
这种编码将所有字符全部编码为2个字符,可以便于机器的处理。对于0x0080以上的字符,它无疑是提升了计算机处理的性能。
(Unicode本地化:显然2个字符不可能编码世界所有的文字,于是各个地区对某些字符本地化,使其能适应自身需求)
3,UTF-32
它将所有字符编码为4个字节。这样,世界就是一家了。可是这太浪费空间了,目前不常用。
二,ANSI 字符和 Unicode字符 与字符串数据类型
Microsoft的 C/C++编译器定义了一个内建的数据类型 wchar_t 它表示一个16位的Unicode字符。
ANSI: char c = 'A' //一个8位字符
char szBuffer[] = "A String"
Unicode: wchar_t ch = L'A'; // 一个16位的字符
wchar_t szBuffer = L"A string"
另外对于类型 CHAR WCHAR TCHAR 在头文件WinNT.h中可以找到如下定义
typedef char CHAR
typedef wchat_t WCHAT
#ifdef UNICODE
typedef WCHAR TCHAR
#else
typedef CHAR TCHAR
显而易见,TCHAR 是一个根据系统环境变化的类型,为了增强程序的可移植性,应当使用TCHAR。
补充:
Windows中自定义了大量的数据类型。
P: pointerC: const
STR: char[]
T: char 或者wchar_t
例如PTSTR: 指向一个字符串的指针 PCTSTR 指向一个常字符串的指针
三,ANSI与Unicode 转换
Windows提供了两个API函数来完成
int MultiByteToWideChar(
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
int WideCharToMultiByte(
UINT CodePage, // code page
DWORD dwFlags, // performance and mapping flags
LPCWSTR lpWideCharStr, // wide-character string
int cchWideChar, // number of chars in string
LPSTR lpMultiByteStr, // buffer for new string
int cbMultiByte, // size of buffer
LPCSTR lpDefaultChar, // default for unmappable chars
LPBOOL lpUsedDefaultChar // set when default char used
);
具体用法可参阅MSDN.
值得一提的是,对于ANSI与Unicode,Windows API中,都是*****A 内部首先调用 WideCharToMultiByte 转换参数提供给***W版本,然后将结果WideCharToMultiByte后再返回给用户。
四,字符串处理的变化
标准C提供的字符串处理函数已经不能适应Windows 下Unicode的平台了,于是Windows提供了相对应的函数。
strlen -------------------------------- wcslen
strcat -------------------------------- wcscat
等等。
同时,还有一组安全的字符串函数:
****_s
例如 _tcscpy_s
类似的函数还有很多,具体参阅CSDN
另外:Windows支持shell字符串处理函数
http://msdn.microsoft.com/en-us/library/ms538658.aspx