今天学习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.^_^