Windows核心编程学习笔记(2)字符编码

在这里插入图片描述
大家好,我是米兰,一个五年级开始编程的小伙。我曾经研究过各种技术,在代码底层摸爬打滚,经历过无数次从入门到放弃的生活,感受过黑暗与毒打。如果你也有相同的经历和探究的问题,欢迎关注我,咱们共同探究,共同进步。在这里插入图片描述今天我要分享给朋友们的笔记是《Windows核心编程学习笔记(2)字符编码》。为了方便各位朋友,下面我截取了本书的相关章节。
在这里插入图片描述在这里插入图片描述
因为这个版本是第四版的,所以有差错请谅解。而我阅读的是第五版,内容方面与第四版完全相同,所以各位读者不必担心。废话不多说,送货!
在这里插入图片描述
在本节开始之前,先探讨一下ASCII字符集,对接下来的内容进行相关补充,我们在实际学习以及项目开发中遇见最多的就是ASCII,而本节将要讨论的是ANSI字符串。ASCII和ANSI的区别和联系究竟是什么?ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H—FFH)被称为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其它符号。这种字符编码规则显然用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字,255个字符显然不够用。
于是,各个国家相继制定了自制的文字编码规范,其中中文的文字编码规范叫做“GB2312—80”,它是和ASCII兼容的一种编码规范,其实就是利用扩展ASCII没有真正标准化这一点,把一个中文字符用两个扩展ASCII字符来表示,以区分ASCII码部分。然而该种解决方法仍存在相关漏洞,最大的漏洞就是中文的文字编码和扩展ASCII码有重叠。而很多软件利用扩展ASCII码的英文制表符来画表格,这样的软件安装和应用到中文系统中,这些制表符就会当作中文字符进行显示,导致出现乱码。另外,由于各国和各地区都有自己的地区文字和文字编码规则,很容易产生互相冲突的现象,照成地区间和国际间正常信息交换的不必要麻烦。若要解决此问题,就不能依赖扩展ASCII,必须有一个全新的编码系统和编码机制,该系统必须同时具备兼容多元文字和符号的能力,并为为每一个文字都分配一个单独码位。终于在1988年Unicode的问世使问题得到了根本性解决,Unicode也是一种字符编码方式,单个字符占用两个字节(0000H—FFFFH),累计容纳65536个字符,这完全可以容纳全世界所有语言文字的编码。在Unicode里,所有的字符具有相同属性,汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”,换言之,所有的文字在Unicode中均按一个字符来处理,其均有一个唯一的Unicode码位。下文将要讨论的ANSI指的是ASCII字符集以及由此派生并兼容的字符集,如:GB2312,通常称为ANSI字符集。多年来,我们一直将文本字符串编写为一组以0结尾的单字节字符集合,与之相对应的处理函数也为我们熟知。但是一个字节最多能表示出256个符号,以汉字为例,这是不够用的(汉字通常单个占用2个字节的空间),这意味系统在读取前一个字节时,得到的是这个汉字的一部分,这是十分麻烦的,为此,我们可以使用Windows函数和C运行库对Unicode字符串的支持。 在Windows Vista每个Unicode字符都使用UTF-16编码,UTF-16将每个字符编码为2个字节(16位),对于16位仍不足以表示某些语言的所有字符,UTF-16使用代理,代理用32位(4个字节)来表示一个字符。相对于其他编码体系Unicode字符使用UTF-16可以节省空间,简化代码,下面列出其他表示字符的UTF标准。
UTF-8:UTF-8将值在0x0080(个人理解:这个值应该指的是码位,书上没有具体表述)的字符压缩为1个字节, 适合于美国使用的字符,0x0080至0x07FF间的字符转换为2个字节,适于欧洲中东地区的语言,0x0800以上的字符都转换为3个字节,适合地区为东亚地区,最后,代理对被写为4个字节,UTF-8编码相当流行,但在对为 0x0800及以上的字符大量进行编码时,不如UTF16高效。
UTF-32:一般在应用程序内部使用,无需考虑代理,每个字符为4个字节(32位),在内存上看并不高效。目前,Uniade支持很多种文字符号(一种语言文字为一种文字符号),并定义了码位(一个字符在字符集中的位置)。每个新个版本的Unicode都会在现在的基础上引进新的字符甚至文字符号。在这里插入图片描述
今天的笔记就到这里了,更多教程和笔记请关注我,由于我是第一次写博客,有很多错误在所难免,欢迎大家指出,大家有疑问也可以多多交流,共同进步,我尽量用通俗易懂的方式向大家述说Windows核心编程,最后再次感谢Jeffrey RichterChristophe Nasarre大师的亲笔著作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值