Windows字符串深入详解

本文详细探讨了Windows环境下的字符串处理,从C/C++的字符串处理开始,深入到各种字符编码(如GB2312、GBK、GB18060、ANSI和Unicode),再到C++如何处理Unicode,以及Windows对Unicode的支持,包括字符类型、函数、Visual Studio的字符集选项和CString类。最后介绍了ANSI与Unicode字符之间的转换方法。
摘要由CSDN通过智能技术生成

Windows字符串深入详解

本文围绕Windows来讲解字符串处理。任何一本讲编程语言的书籍都会有涉及到字符串处理,C里面用于字符串处理的一般是一些库函数strlen、strcmp、strcat等等,C++用于字符串处理的是string类。用这些函数或者类,一般就能达到我们的字符串处理需求。当开始涉及windows编程的时候,又出现了更多跟字符串相关的类型、宏和类,这不禁让很多新手一头雾水。本文将从C/C++字符处理开始,进而深入讨论各种字符编码,再到windows的字符串处理,让读者由浅入深了解字符串处理的各个细节。

一、C/C++字符串处理

C++用于保存字符的类型是char,从数据类型来看,char同short、int相比,仅仅是长度不一样,表示的数据范围不一样,没有其它什么差别。我们知道,当给char变量赋值一个字符时,实际上char变量保存的是该字符的ASCII码,既然short比char表示的数据范围大,字符能赋给char变量,当然也就能赋给short变量。因此,下面的语句都是没问题的。

char ch1 = 'a';
short ch2 = 'a';
int ch3 = 'a';

既然上面3条语句都没问题,为什么平时都是用第一种,而不是后面的两种呢?因为对于ASCII字符来说,只用一个字节的长度就能够编码,用下面的两种方式都存在存储空间的浪费。C++的各种I/O类也就只对char定义了不一样的<<操作符。下面的几条语句效果就不一样了

cout << ch1 << endl;
cout << ch2 << endl;
cout << ch3 << endl;

对于char类型,cout会将其输出为对应的ASCII字符,short和int型变量则只是输出它们内部存储的字符的ASCII码,这取决于iostream是如何对这3种类型重载<<操作符。
这里写图片描述
同理,我们在对char指针指向的字符串和short指针指向的字符串进行输出时,前者可以正确输出字符串的内容,后者只是输出指针的值。

二、字符串编码

2.1 GB2312

一开始计算机只在美国使用,用一个字节存储的ASCII字符已经够用了。但是后来,世界各地都开始使用计算机了,而且他们国家使用的不是英文,他们的字符在ASCII里面是没有的,为了可以在计算机保存他们的文字,它们决定采用127号之后的空位来表示这些新的字符,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128到255这段范围的字符称为“扩展字符集”。

等到中国人开始使用计算机时,已经没有多余的字节状态来表示汉字了。于是中国人想出了一套新的编码方案,将127号之后的符号都取消,重新规定:
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。这种汉字方案叫做“GB2312”。unicode,ansi,utf-8,unicode big endian编码的区别

之所以要有半角和全角之分,是因为英文字符的宽度比汉字要窄很多,这样的英文字符和汉字放在一起会显得不协调。因此重新定义了字符的宽距版本,以便符合汉字的宽度。

2.2 GBK

但是中国的汉字太多了,很快就发现很多人的人名没办法打出来。于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准。

2.3 GB18060

前面两种编码方案,对于原有的ASCII字符还是使用一个字节编码,对于我们新增加的字符使用两个字节。这就是变长多字节字符集。GB18060是我国目前最新的变长多字节字符集,兼容GB2312、GBK以及Unicode3.1。每个字符可以由1个、2个或4个字节组成,支持国内少数民族文字,包含繁体汉字以及日韩汉字。它包括单字节的ASCII、双字节的GBK、

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值