一 引入问题
代码 wchar_t a[3]=L”中国”,编译时出错,出错信息为:数组越界。但 wchar_t 是一个宽字节 类型,数组 a 的大小应为 6 个字节,而两个汉字的的 unicode 码占 4 个字节,再加上一个结束符, 最多 6 个字节,所以应该不会越界。难道是编译器出问题了?
二 解决引入
问题所需的知识
主要需两方面的知识,第一个为字符尤其是汉字的编码,以及语言和工具的支持情况,第二个是 vc/c++中 MutiByte Charater Set 和 Wide Character Set 有关内存分配的情况.
三 汉字的编码方式及在 vc/c++中的处理 vc/c++中的处理
1.汉字编码方式的介绍 对英文字符的处理,7 位 ASCII 码字符集中的字符即可满足使用需求,且英文字符在计算机上的输 入及输出也非常简单,因此,英文字符的输入、存储、内部处理和输出都可以只用同一个编码(如 ASCII 码)。 而汉字是一种象形文字, 字数极多 (现代汉字中仅常用字就有六、 七千个, 总字数高达 5 万个以上) , 且字形复杂,每一个汉字都有"音、形、义"三要素,同音字、异体字也很多,这些都给汉字的的计 算机处理带来了很大的困难。要在计算机中处理汉字,必须解决以下几个问题:首先是汉字的输入, 即如何把结构复杂的方块汉字输入到计算机中去,这是汉字处理的关键;其次,汉字在计算机内如 何表示和存储?如何与西文兼容?最后,如何将汉字的处理结果从计算机内输出? 为此,必须将汉字代码化,即对汉字进行编码。对应于上述汉字处理过程中的输入、内部处理及输 出这三个主要环节,每一个汉字的编码都包括输入码、交换码、内部码和字形码。在计算机的汉字 信息处理系统中,处理汉字时要进行如下的代码转换:输入码→交换码→内部码→字形码。 (1)输入码: 作用是,利用它和现有的标准西文键盘结合来输入汉字。输入码也称为外码。主要归 为四类: a) b) c) d) 数字编码:数字编码是用等长的数字串为汉字逐一编号,以这个编号作为汉字的输入码。 拼音码:拼音码是以汉字的读音为基础的输入办法。 字形码:字形码是以汉字的字形结构为基础的输入编码。例如,五笔字型码(王码)。 音形码:音形码是兼顾汉字的读音和字形的输入编码。 例如,区位码、电报码等都属于数字编码。
(2)交换码:用于汉字外码和内部码的交换。交换码的国家标准代号为 GB2312-80。
(3)内部码:内部码是汉字在
计算机内的基本表示形式,是计算机对汉字进行识别、存储、处理和传 输所用的编码。内部码也是双字节编码,将国标码两个字节的最高位都置为"1",即转换成汉字的内 部码。 (4)字形码:字形码是表示汉字字
形信息(汉字的结构、形状、笔划等)的编码,用来实现计算机对 汉字的输出(显示、打印)。 2.VC 中汉字的编码方式 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++中输出汉字字符的过程。 unsigned char input[50]; cin>>input; int flag=0; for(int i =0 ;i < 50 ;i++) { if(input[i] > 0xa0 &;&; input[i] != 0) { if(flag == 1) { cou