Chapter02 Unicode

今天学习Unicode(16位字符编码)的发展,以及与Windows程序设计的紧密关系。

1.Unicode的发展

字符集从遥远的古代到现代,诞生了各种各样的字符表示方法。尤其进入计算机时代后,随着计算机在世界范围内的推广使用,以及相关人士着力于推动字符集的全球化统一工作,Unicode逐渐接过了ANSI的使命,在计算机世界里获得了更多的应用与推广。Unicode详细发展历程以及其他相关内容推荐阅读百科-Unicode(网址http://baike.baidu.com/view/40801.htm?fr=wordsearch#5),里边详细介绍了Unicode的发展、方式等等。

2.Unicode与Windows程序设计的关系

首先声明,Unicode与宽字符集并不能够等价,Unicode只是宽字符集中的一种,但鉴于我们接下来涉及到的Windows程序设计特点,我们将把宽字符与Unicode等价。

Unicode在Windows程序设计中最突出的应用场景是字符串操作,接下来我们将通过ANSI字符(单字节字符)函数和Unicode字符(双字节字符)函数对比的方式,学习Windows程序设计中字符串的操作方法。

1>字符类型

ANSI字符类型定义:

typedef char CHAR;

宽字符类型定义:

typedef wchar_t WCHAR;//wchar_t类型是无符号短整型类型,2个字节

2>字符指针

ANSI字符指针定义:

typedef CHAR *PCHAR, *LPCH, *PCH;
typedef CONST CHAR *LPCCH, *PCCH;

宽字符指针定义:

typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
typedef CONST WCHAR *LPCWCH, *PCWCH;

3>通用字符类型/字符指针类型

#ifdef  UNICODE                     // r_winnt
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#else   /* UNICODE */               // r_winnt
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#endif

4>字符串操作函数

获取字符串长度:

 iLength = lstrlen(pString);

复制字符串:

pString = lstrcpy(pString1, pString2);

复制特定长度的字符串:

pString = lstrcpyn(pString1, pString2, iCount);

连接字符串:

pString = lstrcat(pString1, pString2);

字符串比较:

iComp = lstrcmp(pString1, pString2);

忽略字母大小的字符串比较:

iComp = lstrcmpi(pString1, pString2);

重点了解下格式化字符串函数sprintf/_snprintf/vsprintf

1)sprintf,功能是格式化字符串内容到指定的字符缓冲区内,函数声明如下:

int sprintf(char* szBuffer, const char* szFormat, ...);

第一个参数szBuffer,是一个字符串缓冲区,用于存储格式化后的字符串内容。

第二个参数szFormat,是一个格式化字符串

返回值表示格式化后的字符串长度。

注意:使用sprintf函数需要考虑定义的字符串缓冲区必须足够大以存放结果。

sprintf对应的宽字符函数为swprintf,对应的通用函数为_stprintf

2)_snprintf,功能与sprintf相同,函数声明如下:

int _snprintf(
   char *buffer,
   size_t count,
   const char *format [,
      argument] ... 
);

其他参数与sprintf函数作用相同,其中count变量表示字符缓冲区的大小。

_snprintf对应的宽字符函数为_snwprintf,对应的通用函数为_sntprintf

3)vsprintf,功能与sprintf相同,函数声明如下:

int vsprintf(
   char *buffer,
   const char *format,
      va_list argptr 
);

第一个参数buffer,表示存放格式化后字符串的缓冲区

第二个参数format,表示一个格式化字符串

第三个参数argptr,表示指向待格式化的参数数组的指针

4)用vsprintf函数实现sprintf函数的功能:

int sprintf(char* szBuffer, const char* szFormat, ...)
{
       int iReturn;
       va_list pArgs;
	
	va_start(pArgs, szFormat);
	iReturn = vsprintf(szBuffer, szFormat, pArgs);
	va_end(pArgs);

	return iReturn;       
}

其中宏va_list, va_start, va_end帮助处理堆栈指针。

vsprintf对应的宽字符函数为vswprintf,对应的通用函数为_vstprintf

3.总结

这次我们学习了Unicode和以及Unicode在Windows程序设计中的应用,前两年看这些章节的时候感觉没什么意思,当工作后再细细品味这些内容,觉得这里边充满了内容,哈哈。接下来我们将学习“窗口与消息”,自己小小期待下。

Bye.^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值