Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370226
  • 博文数量: 132
  • 博客积分: 3066
  • 博客等级: 中校
  • 技术积分: 781
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-14 16:19
文章分类

全部博文(132)

文章存档

2012年(1)

2010年(50)

2009年(81)

我的朋友

分类: C/C++

2009-05-22 12:18:50

Unicode字符集学习笔记
《windows程序设计》的Unicode字符集学习笔记:


1: C语言通过对宽字符集的支持来支持Unicode

2: C中的宽字符基于wchar_t数据型态,它在几个表头文件包括WCHAR.H中都有如下定义:typedef unsigned short wchar_t ;因此,wchar_t数据型态与无符号短整数型态相同,都是16位宽。

3: 要定义包含一个宽字符的变量,可使用下面的语句;wchar_t c = 'A' ;
变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在内存中。如果检查Unicode文字的计算机储存应注意这一点。)这点需注意!

4: 可定义指向宽字符串的指针:wchar_t * p = L"Hello!" ;
注意紧接在第一个引号前面的大写字母L(代表「long」)。
如果忘记了包含L,C编译器通常会给提出警告或错误信息。

5: strlen函数的宽字符版是wcslen(wide-character string length:宽字符串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:
size_t __cdecl strlen (const char *) ;       
而wcslen函数则说明如下:
size_t __cdecl wcslen (const wchar_t *) ;
要得到宽字符串的长度可以呼叫
iLength = wcslen (pw) ;
函数将返回字符串中的字符数6。改成宽字节后,字符串的字符长度不改变,只是位组长度改变了。

6: 所有带有字符串参数的C执行时期链接库函数都有宽字符版。

7: 如果定义了名为_UNICODE的标识符,并且程序中包含了TCHAR.H表头文件,那么_tcslen就定义为wcslen:
#define _tcslen wcslen       
如果没有定义UNICODE,则_tcslen定义为strlen:
#define _tcslen strlen

8: 如果定义了_UNICODE标识符,那么一个称作__T的宏就定义如下:
#define __T(x) L##x
这是相当晦涩的语法,但合乎ANSI C标准的前置处理器规范。那一对井字号称为「粘贴符号(token paste)」,它将字母L添加到宏参数上。因此,如果宏参数是"Hello!",则L##x就是L"Hello!"。

9: typedef char CHAR ;       
   typedef wchar_t WCHAR ;    // wc       
当您需要定义8位字符或者16位字符时,推荐您在Windows程序中使用的数据型态是CHAR和WCHAR。
WCHAR定义后面的注释是匈牙利标记法的建议:一个基于WCHAR数据型态的变量可在前面附加上字母wc以说明一个宽字符。

10: WINNT.H表头文件进而定义了可用做8位字符串指针的六种数据型态和四个可用做const 8位字符串指针的数据型态。这里精选了表头文件中一些实用的说明数据型态语句:
typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;       
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;       
前缀N和L表示「near」和「long」,指的是16位Windows中两种大小不同的指标。在Win32中near和long指标没有区别。
类似地,WINNT.H定义了六种可作为16位字符串指针的数据型态和四种可作为const 16位字符串指针的数据型态:
typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;       
typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;
      
11: 在USER32.DLL中,没有32位MessageBox函数的进入点。实际上,有两个进入点,一个名为MessageBoxA(ASCII版),另一个名为MessageBoxW(宽字符版)。

ILength = lstrlen (pString) ;
       
pString = lstrcpy (pString1, pString2) ;
       
pString = lstrcpyn (pString1, pString2, iCount) ;
       
pString = lstrcat (pString1, pString2) ;
       
iComp = lstrcmp (pString1, pString2) ;
       
iComp = lstrcmpi (pString1, pString2) ;
       
这些函数与C链接库中对应的函数功能相同。如果定义了UNICODE标识符,那么这些函数将接受宽字符串,否则只接受常规字符串。宽字符串版的lstrlenW函数可在Windows 98中执行。

12: 可以使用sprintf及sprintf系列中的其它函数来显示文字。这些函数除了将内容格式化输出到函数第一个参数所提供的字符串缓冲区以外,其功能与printfI相同。然后便可对该字符串进行操作(例如将其传给MessageBox)。

13: Windows的wsprintf和wvsprintf函数在功能上与sprintf和vsprintf相同,但它们不能处理浮点格式。
阅读(591) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~