Win32预备知识

ASCII编码

由于计算机内存中存储数据都是以二进制数据(0,1)存储,所以为了存储字符(如a),我们将

每一个字符都赋值一个数字进行表示,如a对应97,b对应98。这样每一个字符都有对应的二进制

数据,也叫做ASCII编码,用于保存在内存中 了。这就是所谓的ASCII编码的来源

ASCII码使用指定的7 位二进制数组合来表示128种可能的字符。标准ASCII 码也叫基础ASCII码,

使用7位二进制数(高位二进制为0)来表示所有的大写和小写字母,数字0到9、标点符号, 以及

在美式英语中使用的特殊控制字符。其中最后一位用于奇偶校验。

由于实际应用中,7位的ASCII码表往往无法满足正常需求,所以就有了拓展的ASCII码表,它扩充

了高位为1的8位代码(即十进制128-255)用来表示其他字符

由于ASCII码无法存储中文,所以规定使用两个拓展ASCII表拼成一个汉字

ASCII码存在的问题: 我们在使用ASCII表的时候通常会出现乱码的问题以及使用ASCII码判断内容

的时候,通常会出现误差。这是由于不同国家可能使用不同的ASCII表,比如一个汉字的编码,系

统可能会认为是一个日文

类似于ASCII码的一张全是中文汉字的表: GB2312-80码。

UNICODE编码

为了解决各种ASCII表产生的各种问题,所以有了UNICODE表。Unicode把所有常用语言都统一到

一套编码里,这样就不会再有乱码问题了。Unicode最常用的是用两个字节表示一个字符(如果要

用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

C语言中的宽字符的存储

举个例子:

'中'字的各种形式表示:

ASCII码为d6 d0

UNICODE为4e 2d

char x = ‘中‘; d0,原因是char是单字节,所以就只存入了ASCII码的d0

为了完整的存储ASCII码,所以要应用wchar_t x1 = '中';此时内存中存储两个字节 0xD0D6

但如果要以Unicode码进行存储要wchar_t x1 = L'中';此时内存存储0x2D4E

宽字符的使用

char x[] = "中国"; 0XD6D0B9FA00,使用拓展ASCII编码表,以00结尾

wchar_t x1[] = L"中国"; 0X2D4EFD560000,使用Unicode编码表,以00 00结尾

控制台打印

使用不同编码格式时需要配套使用相应的函数

在控制台中:

多字节使用printf("%s\n",x);

宽字符使用wprintf(L"%s\n",x1);

编译器默认的是使用ASCII表来查找字符的,当我们使用” L “就是告诉编译器,使用Unicode码,这

时候编译器就会使用Unicode表来代替ASCII码查找字符了。

如何告诉编译器在控制台打印简体中文

当我们需要打印一个Unicode编码的文字时:

wchar_t x1[] = L"中国"

wprintf(L"%s\n", &x1);

此时程序并不会打印相应的汉字,这是由于程序内存是以Unicode存储数据的而Unicode表中记录

了很多国家的文字,程序无法分辨应该打印哪种语言此时我们需要包含#include <locale.h> 头文

件,并在main函数中加入setlocale(LC_ALL,"");函数,这个函数就是在告诉系统,我们本地默认操

作系统的地域,比如你的操作系统为中国,那么它就会设置为简体中文。此时控制台打印的时候打

印简体中文

C语言宽字符函数

1.字符串长度

对于多字节,我们可以使用strlen(); 函数来计算字符串长度(不包含末尾的\00)。

对于宽字符,我们可以使用wcslen(); 函数来计算字符串长度(不包含末尾的\00 \00)。

以下一个例子进行说明:

使用多字节保存”中国“时,字符串长度为4,使用宽字节保存”中国“时,字符串长度也为4,这说明了

多字节为单个字节存储,宽字符为两个字节存储。

2.C语言字符串复制

我们可以使用strcpy();函数来进行字符串的复制和赋值

对于宽字符,我们可以使用wcscpy();函数来进行字符串的复制:

补充:当我们使用宏#define _CRT_SECURE_NO_WARINGS时程序会少了对很多不安全的问题

报错

这里我们介绍几个其他的常用的宽字符函数:

1.wcscat函数

函数原型:wchar_t *wcscat(wchar_t *strDestination, const wchar_t *strSource);

函数功能:把strSource所指字符串添加到strDestination结尾处,覆盖strDestination结尾处的’\0’并

添加’\0’。

说明:strSource和strDestination所指内存区域不可以重叠且strDestination必须有足够的空间来容

纳strSource的字符串。

返回值:返回指向strDestination的指针.。

备注:因为wcscat在strDestination追加strSource前不进行检查,这是一个缓冲区溢出的潜在原

因。故使用时应注意。推荐使用wcscat_s替代。

2.wcscmp函数

函数原型:int wcscmp(const wchar_t *_Str1, const wchar_t *_Str2);

函数功能:比较字符串_Str1和_Str2

说明:

当_Str1<_Str2时,返回值<0

当_Str1=_Str2时,返回值=0

当_Str1>_Str2时,返回值>0

即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为

止,如: “A”<“B” “a”>“A” “computer”>“compare”

3.wcsstr函数

函数原型:const wchar_t* wcsstr (const wchar_t* wcs1, const wchar_t* wcs2);

查找宽字符串wcs1的子字符串wcs2。

返回一个指针,该指针指向wcs1中的wcs2首次出现的位置,或则,如果wcs2不是wcs1的一部分,

则返回null。

匹配的过程不包括结尾的null宽字符,但是它在那儿结束。

Win32API

1.Win32 API即为Microsoft 32位平台的应用程序编程接口,所有在Win32平台上运行的应用程序都

可以调用这些函数。这些API主要存放在C:\WINDOWS\system32下的所有dll,即动态链接库也就

是Windows库

2.DLL是重要的,但它只是一个接口,我们通过使用它去调用真正的内核函数,DLL有以下三种:

1.Kernel32.dll

最核心的功能模块,比如管理内存,进程和线程相关的函数。

2.User32.dll

是Windows用户界面相关应用程序接口,如创建窗口和发送消息等。

3.GDI32.dll

全程Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数,比如要显示

一个程序窗口,就调用了其中的函数来画这个窗口。

3.在我们实际的Windows编程中,常常需要包含Windows头文件以使用Windows的API:

windows.h - 所有windows头文件的集合

windef.h - windows数据类型

winbase.h - kernel32的API

wingdi.h - gdi32的API

winuser.h - user32的API

winnt.h - UNICODE字符集支持

如上所示,我们一般只需要包含windows.h即可

4.使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32

位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在

各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。

5.在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函

数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外

一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。

6.标准Win32 API函数可以分为以下几类:

窗口管理

窗口通用控制

Shell特性

图形设备接口

系统服务

国际特性

网络服务

Win32API中的宽字符和多字节字符

Windows是C语言开发的,WIn32API同时支持宽字符和多字节字符。

字符类型

C语言    API

char     CHAR

wchar_t   WCHAR

宏       TCHER 该类型根据当前项目自适应选择类型

其实这些类型都是C语言中的基本数据类型,只是使用typedef关键字进行了重命名。

其中使用宏的时候,编译器会自动匹配正确的格式,就像C++中的模板。

Windows中所有内核函数使用字符串都是宽字节,但实际书写win32函数时也可以使用多字节版

本,原因是对程序员长期积累的习惯的妥协

此时我们自己定义了一个函数a,它的实际内核函数为NTA,Windows会给我们提供两个版本,多

字节字符和宽字节字符。但Windows内核中使用的是宽字节版本,但我们正常使用是多字节字符

版,所以在a执行前,Windows会将多字节字符版转换为宽字节字符版

对于win32来说,字符串类型选择我们统一使用TCHAR类型,这是为了良好的书写习惯,

win32开发为字符数组赋值

CAHR cha[] = "中国"; 多字节字符环境下

WCHAR chw[] = "中国"; 宽字节字符环境下

TCHER cht[] = "中国"; 是否添加L会因环境的不同而导致TCHAR类型的不同发生错误

TCHER cht[] = TEXT"中国";因此加入TEXT使字符自适应环境进行类型的变化

为字符串指针赋值

PSTR pszChar = "China";

PWSTR pszWCher = "Chaina";

PTSTR pszTchar = TEXT"China";

字符串指针类型

PSTR(LPSTR)

PWSTR(LPWSTR)

宏 PTSTR(LPTSTR)

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值