win32-编码
0x1原始的ascii编码
在计算机中,计算机只能识别由0或1构成的东西,其它的字符一律不认识,西方人为了将计算机与生活联系起来,使用了ascii的编码,就是将一些生活中常用的符合字母用0、1来表示,16进制范围是0-7F,更多的是比如大写手的A这个字母,在计算机中表示就是1000001
| 字符 | 二进制 | 十进制 | 16进制 |
|---|---|---|---|
| A | 1000001 | 65 | 41 |
| B | 1000010 | 66 | 42 |
| C | 1000011 | 67 | 43 |
有关asscii的文本进制转换可以在在线工具 https://kuangtant.gitee.io/tools/asscii/ 转换
但是,原始的asscii编码有一个很大的缺点,就是只有西文的字母符号,一般说它是标准的asscii编码,没有其它国家的任何语言字符,比如中文,后面就有了asscii的拓展
0x2 asscii的拓展
标准的asscii的编码的范围是0-127,拓展的范围就是128-255,这个拓展是将西文中一些不常用的符号表示出来
对于中文,就采用两张asscii的拓展表,联合在一起,表示一个中文汉字,也就是说,一个中文汉字的表示要占用16位,也就是2个字节,标准的表示就是GBK编码或GB2312编码
| 字符 | 16进制 |
|---|---|
| 中 | D6D0 |
| 国 | B9FA |
| 好 | BAC3 |
标准的asscii/gb2312编码在线查询及转换:https://kuangtant.gitee.io/tools/gb2312/
0x3 Unicode编码
前面两种编码都存在一些问题,就是在不同的国家,编码显示的文字可能不一样,因为编码的读取方式不同
后面出现了一张包含世界所有文字的一个编码表,只要这个世界上存在的文字符号,统统给与一个唯一的编码,Unicode编码
Unicode编码的范围是0-0x10FFFF,就是说,它可以容纳100多万个符号。
但是,它也有一个问题,它只规定了符号的二进制代码,没有规定这个二进制代码该怎样储存
0x4 Unicode:UTF-16/UTF-8
UTF-16编码以16位无符号整数为单位,即是16位为一个单位,不表示一个字符只有16位。这个要看字符的unicode编码处于什么范围而定,有可能是2个字节,也有可能是4个字节,现在计算机上的unicode编码一般指的是UTF-16
UTF-8:
Unicode编码(16进制) UTF-8字节流(二进制) 000000-00007F0xxxxxxx000080-0007FF110xxxxx10xxxxxx000800-00FFFF1110xxxx10xxxxxx10xxxxxx010000-10FFFF11110xxx10xxxxxx10xxxxxx10xxxxxx
win32-c语言中的宽字符
0x01 字符和字符串在内存中的值
1 | chr str0[] = "中国" |
在没有特殊说明的情况下,str0是asscii的默认编码,中国在内存中会是D6 D0 B9 FA 00,5个字节。
但是,wstr是Unicode的编码的中国,2D 4E FD 56 00 00为其编码,占用6个字节,又叫宽字符。
0x02 常用函数
| 一般asscii | unicode | 描述 |
|---|---|---|
| char | wchar_t | 多字节字符类型,宽字符类型 |
| printf | wprintf | 打印控制台函数 |
| strlen | wcslen | 获取长度 |
| strcpy | wcscpy | 字符串复制 |
| strcat | wcscat | 字符串拼接 |
| strcmp | wcscmp | 字符串比较 |
| strstr | wcsstr | 字符串查找 |
0x03 简单用法
打印宽字符,就代码如下
1 |
|
获取长度
1 |
|
win32-什么是win32 api
主要是存放在c:\WINDOWS\system32下的所有dll
几个比较重要的dll
- Kernel32.dll:最核心的功能模块,比如内存管理、进程和线程相关函数等。
- User32.dll:是windows用户界面相关应用程序的接口,如创建窗口和发送信息等。
- GDI32.dll:全称是图形设备接口
要使用win32 api,在cpp文件的开头需要引用windows.h,就可以尽情使用其api了
常用数据类型
汇编:
| byte | BYTE | PBYTE |
|---|---|---|
| word | WORD | PWORD |
| dword | DWORD | PDWORD |
C语言:
| char | CHAR | PCHAR |
|---|---|---|
| unsigned char | UCHAR | PUCHAR |
| short | SHORT | PSHORT |
| unsigned short | USHORT | PUSHORT |
| int | INT | PINT |
| unsigned int | UINT | PUINT |
在win32中,虽然一些数据类型不常见,其实这些数据类型就是将c语言中的一些数据类型封装了一下
在win32中使用字符串
字符类型:
- CHAR 声明asscii编码的字符串
- WCHAR 声明unicode编码的字符串
- TCHAR根据当前开发环境,自动转换为符合当前环境的上面编码方式之一
1 | CHAR szstr[] = "good1"; //asscii |
字符串指针:
与上面的字符类型相一致,有以下的指针类型
- PSTR是asscii编码字符串对应的指针
- PWSTR是unicode编码字符串对应的指针
- PTSTR根据TCHAR对应的指针
1 | PSTR szstr = "good1";//asscii |
第一个窗口
由于win32采用的是api编程,所以窗口也有一个自己的api函数接口,这个接口是MessageBox()函数。
1 |
|
以上代码演示了第一个win32窗口,由于测试时默认采用的是unicode编码,所以在MessageBox传入参数时,如果title或content采用CHAR类型的字符串类型时,可能会报错”不能将char*的类型分配到LPCWSTR类型的实体”,解决方案:
在工程处右键,属性-常规-字符集,将Unicode字符集改为为多字节字符集,应用并确认即可。
在常量报错时使用”_T”宏(若出现未定义标识符,则需增加头文件#include <tchar.h>)格式:_T( ),或者使用关键字“L”,格式:L””,或者使用TEXT,格式TEXT( )



