当前位置:C++技术网 > 精选软件 > C++语言零基础入门教程:4.8 字符类型的编程应用分析

C++语言零基础入门教程:4.8 字符类型的编程应用分析

更新时间:2016-08-11 23:50:58浏览次数:1+次

    在4.6和4.7节中,我们讲述了字符类型的来龙去脉以及基本数据类型的动态模型,来加深了对数据类型的理解。那么本节我们将进一步来解释字符类型在编程中的应用分析。
    如果只工作在英文字符界面,所有的提示和显示内容都是英文单词和英文的标点符号,我们只需要单字节表示的字符,即窄字符。而如果我们要显示汉字这样的字符,以及汉子标点符号,那么单字节无法表示我们国家的字符了。所以要使用两个字节。
    单字节字符我们用关键字char表示字符类型,双字节的字符用wchar_t表示一个字符。双字节字符一个字符占两个字节哦。这也是我们平常说一个汉字等于两个英文字符的大小的原因。那么,英文字符可不可以用两个字节来表示呢?当然可以。但是英文字符数量有限,一个字节已经够了,那么多出来的一个字节,全是0。不要以为这样的做法没有意义哦,在Unicode字符集编码中,最小编码的就是美国英文字符,也就是我们常常听说的ASCII字符编码表。因为所有这些字符一个字节就表示完了,所以另外一个字节就没东西可放了,就留空了。
    为什么空着还要保留这个字节呢?因为在标准的Unicode编码规则中,统一用两个字节存储一个字符,所以即使用不了,你空着就行了。这样在存储形式上简单统一,在字符处理的时候,就方便。而且,在判断中文和英文字符时,我们就可以利用第一个字节是否为0,就可以辨别中文和英文字符了。
    那么你想到的用不着两个字节的ASCII字符就用一个字节,用得着的汉子就用两个字节,这样岂不是更加节省内存。是的!你真聪明,这就是多字节字符集。
    默认情况下,我们在C++控制台代码中,使用字符串的时候,直接中文英文混用了。默认的,编译器就会按照多字节字符集来存储和读取这些字符串了。

    下面简单看看Unicode和多字节字符集如何存储字符的,如下图所示:

Unicode和多字节字符集如何存储字符的

    可以看到,Unicode确实比较浪费内存。上述所示的数值是十六进制的字符编码值,也就是字符在内存中存储的实际形式。你在内存中只看得到数字,看不到字符哦。

    Unicode形式的字符我们用wchar_t。如果用多字节字符集,我们直接用char。上图用代码表示如下:


void main()
{
    wchar_t *pwChar = L"AA";//unicode版
    char * pChar = "A你B";//多字节字符集版
}
     我们这里使用了字符指针,指向一个字符串。图中并没有标注结尾的空字符,这里特别提示一下。我们这里讲字符,暂时不要管字符串,后面会讲的。


    这里展示的就是一个字符类型该如何使用的示例。在代码中,用双引号括起来AA,然后在双引号外加了一个L,表示这个是Unicode版的字符串,不加L则是多字节字符集版的字符串。而这个是告诉编译器的。编译器根据这个标志,来区分不同的类型,最终生成二进制代码的时候,会将字符串按照不同的字符集编码到可执行文件中存储。

    讲到字符,字符集这个是非常重要的,需要说明。因为你后面在开发的时候,经常遇到字符集转换的问题,我们网站有很多相关的问题可供学习。

    这些背景知识说明了之后,我们来简单介绍一下字符类型的语法,语法非常简单。一个字符用单引号括起来,如'A'。而且,单引号内起作用的只有第一个字符,所以,'AB'实际只会取到'A'这个字符,后面的都无效。那么你会问,如果是'你'这个怎么办呢?你不是占用两个字节吗?是的。我们这里看到的是字符,统计字符数也是以字符为单位,而不是以占用内存大小为单位的。所以,'你'和'A'得到的字符个数都是一个,而且单引号中也只有一个字符有效。如果是多字符字符集,也就是使用char字符,那么编译器会将'A'当做单字节的,将'你'当做两个字节的。如果使用的是unicode字符集,即使用wchar_t,那么编译器就会将'A'和'你'都当做两个字节来存储。

    你会好奇,编译器是如何识别汉字和英文字符的呢?前面在Unicode中,我们谈到了ASCII字符最多占一个字节,实际上,不会超过128个。所以,字符编码值如果大于128就不是英文字符了。而从上面的图可以看到,'你'的字符编码值为0xc40xe3,都是超过128的值。所以,自然可以识别的出来。这是在多字节字符集中如何识别中文和英文字符的方法。

    如果你直接使用char和wchar_t,则明确表明你使用的字符集类型,这样我们直接忽略VS中的字符集设置。而L'A'前面的L也是明确告诉编译器,这个字母是Unicode字符集的,一点也不含糊。

    一般情况下,我们直接写的C/C++的控制台程序,用char就够了,所以你在学习的时候一般很少用到wchar_t。在实际开发中会遇到,也会用到。

    为了内容的完整,我们还应该知道中性字符表示,实际上是一个宏。我们用TCHAR表示一个中性字符,中性字符也就是我们无需考虑字符是什么字符集的,具体使用什么字符集,看项目使用的字符集,即是否定义UNICODE宏。如果定义了UNICODE宏,则TCHAR宏就是wchar_t,如果没有定义,则TCHAR宏就是char。这样我们就不用管我们使用的字符是什么字符集了。这在开发时很常见。示例代码如下:


#include <tchar.h>//要使用中性字符宏等,就要包含这个头文件
void main()
{
    TCHAR ch =_T(‘A’);
}
     而TCHAR的使用就和char一样,没有差别。只不过,第一次见过会比较陌生。


    那么字符类型char占用一个字节,是固定的。既然是字节,也可以理解为一个小整型类型。而前面学习的short、int都是比较大的整型类型。只不过字符类型存储的数值是字符的编码,而不是随便的数字。如果你直接给字符类型变量赋值一个数字,也就是改变了字符变量的字符值了。比如:


char ch = 65;//ch输出显示的字符就是字符A
char ch2 = 'A';//直接赋值一个字符A也是一样的
     那么字符类型介绍到这里也差不多了。重点在于背景知识介绍,语法本身非常简单,随便看哪一本C++编程入门书都有介绍。而我们教程这里介绍的内容,是绝无仅有的。才是最有价值的地方。