C++中文字符相关应用方法详解

开发 后端
C++中文字符的处理相比英文处理来说是比较复杂的一个操作。在这篇文章中,我们将会为大家详细讲解一下相关的操作方法。

C++编程语言应用方式灵活,可以帮助开发人员轻松的实现许多功能需求。今天为大家介绍的C++中文字符的相关处理,就可以以多种方式来实现。大家可以通过这一方法来充分掌握这方面的应用技巧。#t#

一 引入问题

代码 wchar_t a[3]=L”中国”,编译时出错,出错信息为:数组越界。但wchar_t 是一个宽字节类型,数组a的大小应为6个字节,而两个汉字的的unicode码占4个字节,再加上一个结束符,最多6个字节,所以应该不会越界。难道是编译器出问题了?

二 解决引入问题所需的知识

主要需两方面的知识,第一个为字符尤其是汉字的编码,以及语言和工具的支持情况,第二个是vc/c++中MutiByte Charater Set 和 Wide Character Set有关内存分配的情况.

三 汉字的编码方式及在vc/c++中的处理

1.汉字编码方式的介绍

对英文字符的处理,7位ASCII码字符集中的字符即可满足使用需求,且英文字符在计算机上的输入及输出也非常简单,因此,英文字符的输入、存储、内部处理和输出都可以只用同一个编码(如ASCII码)。

而在C++中文字符处理中,汉字是一种象形文字,字数极多(现代汉字中仅常用字就有六、七千个,总字数高达5万个以上),且字形复杂,每一个汉字都有"音、形、义"三要素,同音字、异体字也很多,这些都给汉字的的计算机处理带来了很大的困难。要在计算机中处理汉字,必须解决以下几个问题:首先是汉字的输入,即如何把结构复杂的方块汉字输入到计算机中去,这是汉字处理的关键;其次,汉字在计算机内如何表示和存储?如何与西文兼容?最后,如何将汉字的处理结果从计算机内输出?

为此,必须将汉字代码化,即对汉字进行编码。对应于上述汉字处理过程中的输入、内部处理及输出这三个主要环节,每一个汉字的编码都包括输入码、交换码、内部码和字形码。在计算机的汉字信息处理系统中,处理汉字时要进行如下的代码转换:输入码→交换码→内部码→字形码。

(1)输入码: 作用是,利用它和现有的标准西文键盘结合来输入汉字。输入码也称为外码。主要归为四类:

a) 数字编码:数字编码是用等长的数字串为汉字逐一编号,以这个编号作为汉字的输入码。例如,区位码、电报码等都属于数字编码。

b) 拼音码:拼音码是以汉字的读音为基础的输入办法。

c) 字形码:字形码是以汉字的字形结构为基础的输入编码。例如,五笔字型码(王码)。

d) 音形码:音形码是兼顾汉字的读音和字形的输入编码。

(2)交换码:用于汉字外码和内部码的交换。交换码的国家标准代号为GB2312-80。

(3)内部码:内部码是汉字在计算机内的基本表示形式,是计算机对汉字进行识别、存储、处理和传输所用的编码。内部码也是双字节编码,将国标码两个字节的最高位都置为"1",即转换成汉字的内部码。

(4)字形码:字形码是表示汉字字形信息(汉字的结构、形状、笔划等)的编码,用来实现计算机对汉字的输出(显示、打印)。

2.VC中汉字的编码方式

C++中文字符的处理正是采用了GB2312内部码作为汉字的编码方式,因此vc/c++中的各种输入输出方法,如cin/wcin,cout/wcout,scanf/wsanf,printf/wprintf...都是基于GB2312的,如果汉字的内码不是这种编码方式,那么利用上述各种方法就不会正确的解析汉字。

仔细观察ASCII字符表,从第161个字符开始,后面的字符并不经常为用户所使用,负值也未使用。GB2312编码方式充分利用这一特性,将161-255(-95~-1)之间的数值空间作为汉字的标识码。既然255-161 = 94不能满足汉字容量的要求,就将每两个字符并在一块(即一个汉字占两个字节),显然,94* 94 =8836基本上已经满足了常用汉字个数的要求。计算机处理字符时,当连续处理到两个大与160(或-95~-1)的字节时,就认为这两个字节存放了一个汉字字符。可以用下面的Demo程序来模拟vc/c++中输出汉字字符的过程。

  1. unsigned char input[50];  
  2. cin>>input;  
  3. int flag=0;  
  4. for(int i =0 ;i < 50 ;i++)  
  5. {  
  6. if(input[i] > 0xa0 && input[i] != 0)  
  7. {  
  8. if(flag == 1)  
  9. {  
  10. cout<<"chinese character"<<endl;  
  11. flag = 0;  
  12. }  
  13. else  
  14. {  
  15. flag++;  
  16. }  
  17. }  
  18. else if(input[i] == 0)  
  19. {  
  20. break;  
  21. }  
  22. else   
  23. {  
  24. cout<<"english character"<<endl;  
  25. }  

输入:Hello中国 (“中国”对应的GB2312内码为:214 208,185 250),输出:

  1. english character  
  2. english character  
  3. english character  
  4. english character  
  5. english character  
  6. chinese character  
  7. chinese character 

vc/c++中的英文字符仍然采用ASCII编码方式。可以设想,其他国家程序员利用vc/c++编写程序输入本国字符时,vc/c++则会采用该国的字符编码方式来处理这些字符。问题又产生了,韩国的vc/c++程序在中国的vc/c++上运行时,如果没有相应的内码库,则对韩语字符的显示有可能出现乱码。

我个人猜测,vc安装程序中应该带有不同国家的内码库,这样一来肯定会占用很大的空间。如果所有的国家使用统一的编码方式,且所有的程序设计语言和开发工具都支持这种编码方式该多好!而现实中,确实已经有这种编码方式了,且许多新的语言也都支持这种编码方式,如Java、C#等,它就是下面的Unicode编码。

以上就是对C++中文字符的相关概念介绍。

责任编辑:曹凯 来源: 博客园
相关推荐

2024-03-11 06:05:00

C++字符串

2010-03-05 16:09:44

Python中文字符

2011-01-11 10:05:29

Linux中文字体

2009-11-26 16:43:11

PHP截取中文字符串

2010-02-01 17:31:06

C++类成员

2011-06-16 17:01:21

Qt MeeGo 排序

2009-11-26 16:26:32

PHP字符串mbstr

2010-02-01 10:43:10

C++跨平台应用

2010-02-01 15:59:09

C++逗号操作符

2010-02-05 15:51:06

C++ explici

2010-02-01 16:46:07

C++格式化字符串

2009-12-01 15:41:16

PHP substr截

2009-11-27 09:55:11

PHP截取中文字符

2009-12-03 10:09:36

linux添加字体中文字体

2011-03-30 17:20:18

C++引用

2024-04-01 09:13:20

C++函数递增

2010-02-02 18:01:47

C++字符串替换函数

2021-04-13 14:36:00

鸿蒙HarmonyOS应用

2010-02-03 17:06:36

C++对象复制

2010-02-05 17:09:19

C++创建Web服务
点赞
收藏

51CTO技术栈公众号