[Windows 核心编程] 第二章. Unicode
随着网络通讯的快速发展,网络上提供的软件通常来自不同国度,不少优秀的软件都准备软件本地化推广而努力,要实现软件的本土化就必须了解字符集, 因此处理软件本地化的问题,实际就是处理字符集的问题;
一. 字符集
字符集分为: 多字节字符集(MBCS) 以及 Unicode 字符集;
MBCS 字符集特点:
a. 用一个或二个字节(一部分字占用一个字节,另一部分字占用二个字节)表示对应语言的文字, 占用空间小;
b. 在不同的语言环境下,对应的字节表示不同的文字, 造成软件本地化困难;
c. 由于文字用不定的字节表示,造成软件编写混乱.
Unicode 字符集特点:
a. 每个字符由二个字节构成, 占用空间大;
b. Unicode 编码可包括世界上所有国家语言文字,每一个文字都是编码都是唯一, 因而非常容易实现软件本地化;
c. C Runtime 以及Windows OS都提供相应字符操作函数,编程接口统一简单;
d. Windows2000 之后许多API 都使用Unicode 编码,使用Unicode 字符做为参数,省略字串转换过程提升了性能;
e. WinCE中只支持Unicode Windows;
f. 不同软件数据交互容易。
二. 用Unicode 编写源代码
1. C Runtime 函数
C Runtime 库中提供一系列操作Unicode 字符的一组函数, 类似操作多字节操作函数,但它们通常都是以wcs开头如: wcscpy, wcscat, wcscmp, wcslen, wcsstr, wcschr 等
2. Windows 系统库函数
OS 也针对Unicode 字串也提供了一些函数如: StrCpy, StrCat, StrCmp, StrChr 等, 因为这些函数被包括在Windows Shell
中,通常Shell 在OS启动后都运行,所以性能上稍高一些. 运用这些函数须用头文件: ShlwAPI.h
三. 编写适应不同字符集的软件
编写适用不同字符集的环境的软件再注意两方面:
1. Windows API: Windows 针对ANSI版本有一组API,同时针对Unicode版本有对应 API: 如:ANSI版的CreateFileA
Unicode 版CreateFileW, 但Windows 提供了一组API 宏,能根据当前预定义版进行自动转换对应不同版本
API, 如: CreateFile.
2. 字符串: 不论是C Runtime还是OS 字串操作的API 都有提供三组对应的API—ANSI, Unicode 以及根据预定义自动转换的标准
版, 通常用的 _T 修饰常量字串,_tcsxxx 代替原C Runtime操作ANSI字串的一种函数如:
_tcscpy, _tcscat, _tcscmp, _tcschr, _tcsstr, _tcslen, _stprintf 等. 以及OS 字串API如:
lstrcpy, lstrcat, lstrcmp等.
四. 例程
代码
2 void MBCSStrOperate()
3 {
4 char szData1[256] = {0};
5 char* szData2 = "chenxiaoling";
6 char* szData3 = " is a software engineer.";
7
8 strcpy(szData1, szData2);
9 strcat(szData1, szData3);
10 char* pTmp = strchr(szData1, 'c');
11 if (NULL != pTmp && _ismbclower(*pTmp))
12 {
13 *pTmp = _mbctoupper(*pTmp);
14 }
15
16 char szOutput[512] = {0};
17 sprintf(szOutput, "\nMBS CharSet Operate:\n data: %s\n len: %d\n bytes: %d",
18 szData1, strlen(szData1), strlen(szData1) * sizeof(char));
19
20 //output to output view window
21 OutputDebugStringA(szOutput);
22
23 return;
24 }
25
26 // C运行时库时针对Unicode 字符处理
27 void UnicodeStrOperate()
28 {
29 wchar_t szData1[256] = {0};
30 wchar_t* szData2 = L"chenxiaoling";
31 wchar_t* szData3 = L" is a software engineer.";
32
33 wcscpy(szData1, szData2);
34 wcscat(szData1, szData3);
35 wchar_t* pTmp = wcschr(szData1, L'c');
36 if (NULL != pTmp && iswlower(*pTmp))
37 {
38 *pTmp = towupper(*pTmp);
39 }
40
41 wchar_t szOutput[512] = {0};
42 swprintf(szOutput, L"\nUnicode CharSet Operate:\n data: %s\n len: %d\n bytes: %d",
43 szData1, wcslen(szData1), wcslen(szData1) * sizeof(wchar_t));
44
45 //output to output view window
46 OutputDebugStringW(szOutput);
47
48 return;
49 }
50
51 // C运行时库时通用字符集编程(与编译环境无关)
52 void MBCSORUnicodeStrOperate()
53 {
54 TCHAR szData1[256] = {0};
55 TCHAR* szData2 = _T("chenxiaoling");
56 TCHAR* szData3 = _T(" is a software engineer.");
57
58 _tcscpy(szData1, szData2);
59 _tcscat(szData1, szData3);
60 TCHAR* pTmp = _tcschr(szData1, _T('c'));
61 if (NULL != pTmp && islower(*pTmp))
62 {
63 *pTmp = toupper(*pTmp);
64 }
65
66 TCHAR szOutput[512] = {0};
67 _stprintf(szOutput, _T("\nNo CharSet Operate:\n data: %s\n len: %d\n bytes: %d"),
68 szData1, _tcslen(szData1), _tcslen(szData1) * sizeof(TCHAR));
69
70 //output to output view window
71 OutputDebugString(szOutput);
72
73 return;
74 }
五. 小练习

浙公网安备 33010602011771号