Windows核心编程学习笔记(3) ANSI字符和Unicode字符与字符串数据类型

在这里插入图片描述
大家好,我是米兰,一个五年级开始编程的小伙。我曾经研究过各种技术,在代码底层摸爬打滚,经历过无数次从入门到放弃的生活,感受过黑暗与毒打。如果你也有相同的经历和探究的问题,欢迎关注我,咱们共同探究,共同进步。
在这里插入图片描述
今天我要分享给朋友们的笔记是《Windows核心编程学习笔记(3) ANSI字符和Unicode字符与字符串数据类型》。为了方便各位朋友,下面我截取了本书的相关章节。在这里插入图片描述在这里插入图片描述在这里插入图片描述
因为这个版本是第四版的,所以有差错请谅解。而我阅读的是第五版,内容方面与第四版完全相同,所以各位读者不必担心。废话不多说,送货!
在这里插入图片描述
当我们使用C语言编写程序时,若要处理字符或字符串,通常要声明一个char类型的常量或变量。众所周知,C语言用char类型来表示一个8位的ANSI字符,当我们声明一个字符串时编译器会把字符串转换为一个char类型的数组,下面是一个例子:

char a='A'; //声明单个字符
char strBufer[100]= ”Hello, world !"//声明一个字符串

上期我们谈到过Unicode字符,若要将字符或字将串声明为Unicode类型(UTF -16),可以使用Microsoft C/C++编译器内建类型wchar_t,该类型用于表示16位的Unicode字符并使用UTF -16编码格式。回归到C语言,C头文件也自带了一个wchar_t数据类型:

typedef unsigned short wchar_t;

通过查看头文件的定义,wchar_t类型的原型是无符号整形short。在此处补充说明:宽字符和Unicode并不完全等同,Unicode只是宽字符的一种编码方式。之所以使用无符号类型是因为字符的值均为正值。下面是一个声明Unicode字符和Unicode字符串的例子:

wchar_t b=L 'A'; //声明单个字符
wchar_t String[100] =L" Hello,world!"; //声明一个字符串

在本例中我们通过宏L把字符串转换为Unicode字符串,编译器在编译时,会以UTF-16编码的格式写入程序的数据段。在此处进行补充说明,在Unicode字符集中码位0000到007F(6位代码)的字符为ASCII字符,因为ASCII字符占8个位,换言之,8个位就可以表示出一个ASCII字符,所以wchar_t类型字符串中包含的ASCII字符间以0作为区分。另外为了区别C语言,Microsoft开发团队也定义了自己的数据类型,下面摘抄自WinNT.h头文件:

typedef char CHAR ; //用于表示一个8位的ANSI字符
typedef wchar_t WCHAR; //用于表示一个16号Unicode字符

不难看出,这只是外表形式上的变换,实质并没有变化。WinNT.h还为我们提供大量方便的数据类型:

typedef CHAR *PCHAR;//一个指向单个ANSI字符的指针
typedef CHAR *PSTR;//一个指向ANSI字符串的指针
typedef CONST CHAR *PCSTR;//ANSI字符串的常量指针,不可修改字符串内容
typedef WCHAR *PWCHAR;//一个指向单个Unicode字符的指针
typedef WCHAR *PWSTR;//一个指向Unicode字符串的指针
typedef CONST WCHAR *PCWSTR;//Unicode字符串的常量指针,不可修改字符串内容

作为Wirdows程序员我们最好使用新定义的Windows数据类型。虽然使用哪种类型没有强制要求,但最好是保持一致不要觉得Microsoft团队是在自作聪明(虽然我也这么觉得)。实际上这样可以增强代码的可读性以及可维护性。另外,我们可以利用_TEXT和TEXT宏,这两个宏的用法和功效是一样的,在定义标识符UNICODE和_UNICODE的条件下,其用法相当于宏L。换言之,它会把括号内的字符串自动匹配成相应的类型(Unicode类型或者ANSI类型),具体头文件实现请参照本书,下面是一个举例用法:

TCHAR c=TEXT('A');
TCHAR StringBuffer[100]=_TEXT("This is a string");

在这里插入图片描述
今天的笔记就到这里了,更多教程和笔记请关注我,由于我是第一次写博客,有很多错误在所难免,欢迎大家指出,大家有疑问也可以多多交流,共同进步,我尽量用通俗易懂的方式向大家述说Windows核心编程,最后再次感谢Jeffrey RichterChristophe Nasarre大师的亲笔著作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值