- 浏览: 357792 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
tianshawang:
楼主你好偏心啊,把代码给谷歌不给这里
java 实现windows资源管理器 -
tianshawang:
其实我是也想要资源管理器的代码来的。。
java 实现windows资源管理器 -
hcmfys:
lonuery 写道open file 是获取要进行复制的文件 ...
JAVA 复制 带进度条 时间 百分比 -
qq657052171:
怎么没有代码呢?
java 实现windows资源管理器 -
IT女民工:
楼主,求资源管理器代码~~~~
java 实现windows资源管理器
一 引入问题
代码 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码)。
而汉字是一种象形文字,字数极多(现代汉字中仅常用字就有六、七千个,总字数高达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)
{
cout<<"chinese character"<<endl;
flag = 0;
}
else
{
flag++;
}
}
else if(input[i] == 0)
{
break;
}
else
{
cout<<"english character"<<endl;
}
}
输入:Hello中国 (“中国”对应的GB2312内码为:214 208,185 250)
输出:english character
english character
english character
english character
english character
chinese character
chinese character
vc/c++中的英文字符仍然采用ASCII编码方式。可以设想,其他国家程序员利用vc/c++编写程序输入本国字符时,vc/c++则会采用该国的字符编码方式来处理这些字符。
问题又产生了,韩国的vc/c++程序在中国的vc/c++上运行时,如果没有相应的内码库,则对韩语字符的显示有可能出现乱码。我个人猜测,vc安装程序中应该带有不同国家的内码库,这样一来肯定会占用很大的空间。如果所有的国家使用统一的编码方式,且所有的程序设计语言和开发工具都支持这种编码方式该多好!而现实中,确实已经有这种编码方式了,且许多新的语言也都支持这种编码方式,如Java、C#等,它就是下面的Unicode编码
3.新的内码标准---Unicode
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。最新版本的 Unicode 是 2005年3月31日推出的Unicode 4.1.0 。另外,5.0 Beta已于2005年12月12日推出,以供各会员评价。
Unicode 编码系统可分为编码方式和实现方式两个层次。
编码方式:Unicode 的编码方式与 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相对应,目前的用于实用的 Unicode 版本对应于 UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示 216 个字符。基本满足各种语言的使用。实际上目前版本的 Unicode 尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。
实现方式:Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。如,UTF-8 编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他 Unicode 字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。
Java与C#语言都是采用Unicode编码方式,在这两种语言中定义一个字符,在内存中存放的就是这个字符的两字节Unicode码。如下所示:
char a='我'; => 内存中存放的Unicode码为:25105
4.内码的相互转换
(1)vc中的实现方法
利用Windows系统提供的API:::MultiByteToWideChar和::WideCharToMultiByte
::MultiByteToWideChar:实现当前码到Unicode码的转换;
::WideCharToMultiByte:实现Unicode码到当前码的转换;
(2)Java中的实现方法
String vcString=new String(javaString.getBytes("UTF-8"),"gb2312");
java的编码应该是UTF-8
(3)C#中的实现方法
??
四 vc中的MutiByte Charater Set 和 Wide Character Set
1.MultiByte Charater Set方式
这种方式以按字节为单位存放字符,即如果一个字符码为两字节,则在内存中占两字节,字符码为一字节,就占一字节。例如,字符串“中国abc”的编码为:中(0xd6、0xd0)、国(0xb9、0xfa)、a(0x61)、b(0x62)、c(0x63)、\0(0x00),就存为如下方式:
对应的类型,方法有:
char、scanf、printf、cin、cout …
2.Wide Character Set
这种方式是以两字节为单位存放字符,即如果一个字符码为两字节,则在内存中占四字节,字符码为一字节,就占两字节。例如,字符串“中国abc”就存为如下方式:
对应的类型,方法有:
wchar_t、wscanf、wprintf、wcin、wcout …
造成上面存储方式的根本原因在于,wchar_t类型其实是一个unsigned short 类型。如,存储上面字符串的数组的定义为:wchar_t buffer[8] 等价于unsigned short buffer[8].而所有以字母w开头的方法也都是以unsigned short类型,即两字节为单位来处理字符,因此,存储在wchar_t类型数组中的字符串无法用cout显示,只能用wcout方法来显示。
由于Unicode码也是采用两个字节,因此Wide Character Set方式能够很好的支持Unicode码的存储,但是在vc的环境下要将一个Unicode码存入两字节而不是四字节内存中,必须通过上面的API函数::MultiByteToWideChar。首先,将当前的编码转换为Unicode码,然后,将每个字符的Unicode码放入每一个wchar_t类型的变量中。以下是一个实例代码:
char input[50];
cin>>input;
int size;
size=::MultiByteToWideChar(CP_ACP,0,input,strlen(input)+1,NULL,0);
if(size==0)
return -1;
wchar_t *widebuff=new wchar_t[size];
::MultiByteToWideChar(CP_ACP,0,input,strlen(input)+1,widebuff,size);
输入:中国abc
Debug断点调试:
size==6
数组widebuff[0-size]占12字节,存放了6个字符的Unicode码,码值为:
中(0x4e2d) 国(0x56fd) a(0x0061) b(0x0062) c(0x0063) d(0x0000)
这时,数组的大小size等于输入的字符个数加上一个结束符,符合我们的想象。
五 引入问题的错误分析
(1) 没有理解编译器中的编码方式
虽然vc/c++中汉字的编码占两个字节,但并不是Unicode码,是GB2312码。
(2) 没有理解MutiByte Charater Set 和 Wide Character Set的存储原则;
在vc/c++中,“中国”按char[5]来对待,而wchar_t a[3]实际上是三个unsigned short类型的变量,因此赋值时会越界。
发表评论
-
#ocx 格式转换
2013-06-14 14:31 1041#include<iostream> # ... -
c 创建文件夹
2011-03-02 18:45 1435写道 int create_new_dir(char* ... -
VC之CString,wchar_t,int,string,char*之间的转换方法
2010-09-18 20:11 67001. CString 转 wchar_t CString p ... -
c++ odbc
2010-03-29 16:28 1785#include<windows.h> #inc ... -
vc socket编程
2010-03-16 16:38 23141.TCP服务器端: #include <Winsoc ... -
json ajax
2008-06-27 15:37 957版权所有,转载请注明,来自http://www.jialing ... -
存储过程实现分页 (载至网上) ——~——
2008-07-09 09:33 1138存储过程实现分页 -------------------- ... -
JMAIL发邮件的时候,接收到的邮件标题全是乱码
2008-07-18 12:18 1662天在做JMAIL发邮件的时候,接收到的邮件标题全是乱码,经在B ... -
UTF-8编码
2008-08-14 11:11 853一、操作系统 window系统 ... -
字符与编码
2008-10-30 09:21 1202乱码-我们心中的痛! ... -
c++ BOOKS
2008-11-10 11:11 8431.C++ Primer 中文版(第四版) 2. ... -
c study_13
2009-04-08 22:54 741第十章:文件 文件文件的基本概念 所谓"文 ... -
c_study_01
2009-04-08 22:57 676编译错误信息 说明:Turbo C 的源程序错误分为三种类型 ... -
c_study_02
2009-04-08 22:58 687附录二:Turbo C(V2.0)使用 ... -
c_study_03
2009-04-08 22:59 712c语言的编程风格- - ... -
c_study_04
2009-04-08 23:00 924第二章: 数据类型、运 ... -
c_study_05
2009-04-08 23:01 757第三章: C语言程序设 ... -
c_study_06
2009-04-08 23:03 634第四章: 数组- - ... -
c_study_07
2009-04-08 23:04 771第五章:函数- - ... -
c_study_09
2009-04-08 23:05 658第六章:指针- - ...
相关推荐
从DLL收读取字符串时遇到中文乱码,这里总结一下C#收取字符串时的处理。 C/C++字符串一般通过char* 或wchar_t*来表示,char*表示的是ANSCII字符串, wchar_t*表示Unicode字符串,Unicode字符串在C/C++中一个...
很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...
题目中的问题聚焦于如何正确地截取一个中英混合的字符串,确保在截取过程中不会将汉字字符截断。这个问题涉及到字符编码、字符串处理以及对Unicode的理解。下面将详细解释相关知识点。 首先,我们要理解在C++中处理...
在C++编程中,处理中文字符可能会遇到一些挑战,尤其是涉及到输出到控制台时。由于C++的标准库最初设计时主要关注英文字符集,对于非ASCII编码(如中文的GB2312、GBK或UTF-8等)支持不够直接。在本主题中,我们将...
总之,"汉字字符串拼音排序-QT、C++"这个主题涵盖了C++的字符串操作、QT的QString类、Unicode支持以及中文字符串的拼音处理技术。对于开发涉及中文内容的应用来说,掌握这些知识点是非常有价值的。
在C++编程中,宽字符处理是一个重要的概念,特别是在处理多语言环境,特别是中文字符时。宽字符通常指的是Unicode编码的字符,它们占用多个字节,以表示更广泛的字符集,包括非ASCII码的字符,如汉字。"zhongwen.rar...
由于C++标准库中的`std::string`通常存储的是ASCII字符,所以我们可能需要使用`std::wstring`或自定义数据结构来处理中文字符。同时,我们需要确保字符串的编码方式一致,例如都是UTF-8编码。 以下是一个简化的KMP...
本文将深入探讨如何在C++和C#之间传递中文字符串,并实现回调功能。首先,我们要明白C++和C#之间的互操作性主要依赖于.NET框架的P/Invoke(Platform Invoke)机制。 1. **C++ 编译为 DLL** C++编写的代码可以通过...
这个示例展示了C#与C++之间字符串传递的基本流程,实际应用中可能需要处理更复杂的数据结构和错误处理。理解P/Invoke的工作原理以及跨语言边界的数据类型转换是关键,这有助于构建可扩展且健壮的多语言应用程序。
综上所述,C/C++中从`char`到`wchar_t`的过渡涉及到字符编码的选择、本地化策略的设定以及如何处理多语言环境下的字符串等问题。通过深入了解这些概念,开发者可以更好地设计支持多语言的应用程序,并确保在不同平台...
在C++编程中,统计文本中的单词和汉字是...总的来说,统计文本中的单词和汉字涉及到了C++的字符串处理、字符编码、Unicode支持以及计数算法。通过理解和运用这些概念,我们可以编写出高效且准确的程序来完成这个任务。
本篇文章将深入探讨如何使用C++编程语言将文本字符串转换成BMP(Bitmap)图片。 首先,我们需要了解BMP文件格式。BMP是Windows操作系统中常见的位图文件格式,它存储的是未经压缩的像素数据,包括图像宽度、高度、...
例如,使用标准的单字节字符处理函数可能无法正确处理双字节字符。 了解这些基础知识后,程序员可以更好地处理跨平台和多语言的程序,有效地利用Win32 API提供的功能,以及进行不同字符编码间的转换。在实际开发中...
总的来说,"C++中文汉字转拼音"项目结合了C++编程、数据结构(如STL map)、文本处理和字典查找算法,是自然语言处理技术在C++中的一个实例应用。通过优化和扩展,它可以成为处理中文文本任务的强大工具。
这个“c++车牌字符切割识别程序”旨在处理经过二值化的256色BMP图像,实现对车牌上单个字符的提取和识别。下面将详细介绍这个程序涉及的关键知识点。 1. 图像预处理:在车牌字符识别的初期阶段,通常需要对原始图像...
输入的字符串可以是任何字符,包括中文,这得益于Qt库对Unicode的支持。字符串处理包括校验、编码转换和错误检查等步骤,确保字符串能正确转化为二维码。 5. **图像处理**: 生成的二维码是一个二维像素阵列,...
- **std::string**: 这是C++标准库中提供的字符串类,用于处理单字节的ASCII或DBCS编码的字符串。`std::string`提供了丰富的接口和功能,可以方便地进行字符串操作。 - **BSTR**: 这是在COM编程中常见的字符串类型...
2. **特殊字符处理**:在实际应用中,还需要考虑到特殊字符的处理问题,比如空格、换行符等。 3. **多语言支持**:如果应用程序需要支持多种语言,则需要针对每种语言编写相应的正则表达式。 ### 五、总结 本文...
根据给定的文件信息,我们将深入探讨如何使用C++实现字符串的交集、并集和差集操作。在计算机科学中,集合运算是一项基础而重要的功能,尤其在处理大量数据时,能够有效地进行数据筛选与整合。下面,我们将通过解析...