第2章 Unicode
2.1字符集
软件的本地化要解决的真正问题,实际上就是如何处理不同的字符集.
2.1.1单字节与双字节字符集
如果只是调用strlen函数,那么你无法真正了解字符串中究竟有多少函数,它只能告诉你到达结尾的0之前有多少个字节.在C运行期库没有配备相应的函数,使你能够对双字节字符集进行操作,但是在VC里面却有很多函数可以实现,比如:
_mbslen.
2.1.2 Unicode:宽字节字符集
Unicode提供了一种简单而又一致的表示字符串的方法.Unicode字符串中的所以字符都是16位的.
2.2为什么使用Unicode
2.3Windows 2000与Unicode
2.4Windows 98与Unicode
Windows 98像它的前任产品一样,几乎都是使用ANSI字符串来进行所以的内部操作的.
2.5 Windows CE与Unicode
为了使Windows CE尽量做得小一些,Microsoft公司决定完全不支持ANSI Windows函数.
2.6 需要注意的问题
windows2000既支持Unicode,也支持ANSI,因此可以位任意一种开发应用程序.
windows98只支持ANSI.
windowsCE只支持Unicode.
2.7对COM的简单说明
COM要求使用Unicode字符串.
2.8如何编写Unicode源代码
2.8.1C运行期间对Unicode的支持
C头文件String.h做了修改,增加了一个Unicode字符的数据类型是wchar_t.和此对应的Unicode操作函数都有.比如:
char * strchr(const char*,int);
wchar_t * wcschr(const wchar_t *,wchar_t);
其他类似的函数都用.若想建立双重功能的必须包含TChar.h这个文件.如果在编译的时候引用了_UNICODE,这些宏就会使用wcs这组函数.如果没有定义_UNICODE,那么将引用str这组宏.Microsoft公司的C++编译器能够编译的只能是ANSI字符串.不是Unicode字符串.若要生成一个Unicode字符串必须是:
TCHAR *szError=L"Error";
现在可以用一个宏来代替这个实现:
TCHAR *szError=_TEXT("Error");
2.8.2Windows定义的Unicode数据类型
WCHAR Unicode字符
PWSTR 指向Unicode字符串的执政
PCWSTR 指向一个恒定的Unicode字符串指针
2.9成为符合ANSI和Unicode的应用程序
将文本串视为字符数组,而不是chars数组或字节数组.
将通用数据类型(TCHAR和PTSTR)用于文本字符和字符串.
将显示数据类型(BYTE和PBYTE)用于字节,字节指针和数据缓存.
将TEXT宏用于原义字符和字符串.
执行全局性替换.
修改字符串运算的问题.
2.9.1Windows字符串函数
对Unicode字符串进行操作的函数,主要有lstrcat,lstrcmp,lstrcmpi,lstrcpy,lstrlen.这些宏既可以调用函数的Unicode版本,也可以调用函数的ANSI版本,这就根据编译员代码时是否定义了UNICODE.如果在定义了UNICODE,lstrcat函数将扩展为lstrcatA.如果定义了UNICODE,lstrcat将扩展为lstrcatW.
2.9.2确定文本是ANSI文本还是Unicode文本
IsTextUnicode函数能够帮组进行这种区分.
DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb,PINT pResult);
第一个参数用于标识pvBuffer指向的字节数.第二个参数为大小.第三个参数是个整数,可以指明你要进行哪些测试.也可以为该参数传递NULL.返回值其实是一个BOOL用来反应测试的结果.
2.9.4在Unicode与ANSI之间转换字符串
MultiByteToWideChar用来将多字节字符串转换成宽字节字符串,WideCharToMultiByte将宽字符串转换成等价的多字节字符串.