电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOC文档下载
分享到微信 分享到微博 分享到QQ空间

专升本计算机考试汉字编码问题

  • 资源ID:321836457       资源大小:124.50KB        全文页数:65页
  • 资源格式: DOC        下载积分:3金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要3金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

专升本计算机考试汉字编码问题

专升本计算机考试汉字编码问题由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。一、汉字编码的种类汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。 GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。2、Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X810XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X400X7E(即64-126),0XA10XFE(即161-254),共157种。3、GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。表1 汉字编码范围名称 | 第一字节 | 第二字节-|-|-GB2312 | 0xB0-0xF7(176-247) | 0xA0-0xFE(160-254)-|-|-GBK0 | x81-0xFE(129-254) | 0x40-0xFE(64-254)-|-|-Big5 | 0x81-0xFE(129-255) | 0x40-0x7E(64-126), | | 0xA10xFE(161-254)-|-|-二、对汉字进行hash为了处理汉字的方便,在查找汉字的时候,我们通常会用到hash的方法,那怎么来确定一个汉字位置呢?这就和每种编码的排列有关了,这里主要给出一种hash函数的策略。对于GB2312编码,设输入的汉字为GBword,我们可以采用公式(C1-176)*94 + (C2-161)确定GBindex。其中,C1表示第一字节,C2表示第二字节。具体如下: GBindex = (unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161; 之所以用unsigned char类型,是因为char是一个字节,如果用unsigend int,因为int是4个字节的,所以会造成扩展,导致错误。 对于GBK编码,设输入的汉字为GBKword,则可以采用公式 index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字节,ch2是第二字节。具体的, GBKindex = (unsigned char)GBKword0-129)*190 + (unsigned char)GBKword1-64) - (unsigned char)GBKword1/128;三、怎样判断一个汉字的是什么编码直接根据汉字的编码范围判断,对于GB2312和GBK可用下面两个程序实现。1、判断是否是GB2312bool isGBCode(const string& strIn)unsigned char ch1;unsigned char ch2;if (strIn.size() >= 2)ch1 = (unsigned char)strIn.at(0);ch2 = (unsigned char)strIn.at(1);if (ch1>=176 && ch1<=247 &&ch2>=160 && ch2<=254)return true;else return false;else return false;2、判断是否是GBK编码bool isGBKCode(const string& strIn)unsigned char ch1;unsigned char ch2;if (strIn.size() >= 2)ch1 = (unsigned char)strIn.at(0);ch2 = (unsigned char)strIn.at(1);if (ch1>=129 && ch1<=254 &&ch2>=64 && ch2<=254)return true;else return false;else return false;3、对于Big5它的范围为:高字节从0xA0到0xFE,低字节从0x40到0x7E,和0xA1到0xFE两部分。判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。如何定位呢?那么也想象所有编码排列为一个二维坐标,纵坐标是高字节,横坐标是低字节。这样一行上的汉字个数:(0x7E-0x40+1)+(0xFE-0xA1+1)157。那么定位算法分两块,为: if 0x40<=ch2<=0x7E: #is big5 char index=(ch1-0xA1)*157+(ch2-0x40)*2 elif 0xA1<=ch2<=0xFE: #is big5 char index=(ch1-0xA1)*157+(ch2-0xA1+63)*2 对于第二块,计算偏移量时因为有两块数值,所以在计算后面一段值时,不要忘了前面还有一段值。0x7E-0x40+1=63。四、如果判断一个字符是西文字符还是中文字符大家知道西文字符主要是指ASCII码,它用一个字节表示。且这个字符转换成数字之后,该数字是大于0的,而汉字是两个字节的,第一个字节的转化为数字之后应该是小于0的,因此可以根据每个字节转化为数字之后是否小于0,判断它是否是汉字。例如,设输入字为strin,则, If (strin.at(0) < 0) cout << ”是汉字” << endl; else cout << ”不是汉字” << endl;五、下载GBK编码表(见附件) 下载GB2312编码表见下面的回帖- 另一些与编码相关的文章:1、GB码和BIG5码的互换技术-中文与英文用ASCII码一个字节表示不同,它使用两个字节来表示。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。 GB码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0XA10XFE,共96种。第二个字节的范围分别为0XA10XFE,共96种。利用这两个字节共可定义出 96 * 968836种汉字。实际共有6763个汉字。 BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X810XFE,共126种。第二个字节的范围分别为0X400X7E,0XA10XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 15719782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA4400XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC9400XF9FE,共7652个,剩下的便是一些特殊字符。 制作码表文件的原理是这样的:首先将所有的GB编码写入一个文件,然后,使用具有GB码到BIG5码转换功能的软件,如UCDOS下的CONVERT.EXE,将文件转换为BIG5码文件,即得到码表文件。 下面的程序可将全部国标码写入文件gb.txt(以下全部程序用foxpro书写,可很容易的转换成其他语言) fp = fopen("gb.txt",2) for i=161 to 247 for j=161 to 254 =fwrite(fp,chr(i)+chr(j) next =fwrite(fp,chr(13)+chr(10) next =fwrite(fp,chr(26) =fclose(fp) 文件的组织形式:行对应编码的第一字节,列对应编码的第二字节。使用时请注意编码的偏移量,如汉字“啊”GB编码0xb1a1第一字节0xb1(177)第二字节0xa1(161)所以他应该在文件的第(177-161=16)行第(161-161)*2=0)列。 运行CONVERT.EXE将gb.txt转换成BIG5码的文件,这样就可得到按GB码组织的BIG5码表文件big5.txt。反之亦可得到按BIG5码组织的GB码表文件。 转换的思路是这样的:(用foxpro书写) 首先将码表文件装入数组 fp = fopen("big5.txt") i = 0 do while feof(fp) i = i+1 dime dict dict = fgets(fp) enddo =fclose(fp) 其次将待转换的文本装入变量 create cursor temp (mm m)

注意事项

本文(专升本计算机考试汉字编码问题)为本站会员(diand****sheng)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.