[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等.

四.  例程

代码
 1 // C运行时库针对MBS 字符处理( 用C Runtime 函数)
 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 }

 五.   小练习

posted @ 2010-12-07 20:07  zTercel  阅读(449)  评论(0)    收藏  举报