编码转换01: 编码集和计算机字符显示

编码转换

 

编码转换... 1

1. 编码转换1: 编码集和计算机字符显示... 1

2. 编码转换2:计算机字符显示... 2

 

 

1. 编码转换1: 编码集和计算机字符显示

如同我们所知,计算机采用高低电平分别表示二进制码10。为了表示多于两种的符号,需要采用多位二进制码表示一个符号,由多位二进制表示的一系列符号的集合,称为的编码集。国内最常见的编码集有ASCIIGB2312GBKGB13000GB18030等。

ASCII (American Standard Code For Information Interchange, 美国信息交换标准码)ASCII是基于拉丁字母的一套编码系统,等同于国际标准ISO/IEC646,用7位二进制码表示一个字符,从0x00~0x7F(bin:0000000~1111111)共定义了128个字符,其中0x00~0x1F0x7F表示的33个字符是控制字符(非显示字符),其他95个字符(0x20~0x7E)是可显示字符(包括空格符0x20)。在存储上,一般用8位表示一个ASCII字符,最高位置0,因此其值等同于7位表示。

GB2312(GB2312-80,GB0,信息交换用汉字编码字符集基本集)GB2312是中国国家标准总局发布的一套编码系统,共收录7445个字符,包括682个全形字符和6763个汉字。其所收录的汉字覆盖中国大陆99.75%的使用频率。GB2312不能处理人名、古汉语方面出现的罕见字符,因此后来出现了GBKGB18030编码集。GB2312对符号进行区位处理,共分94区,每区94位。任意区号和位号确定唯一字符,很明显,94*94共可表示8836个字符,除去7445已使用的位置,其他留空。94区中,01~09区为特殊符号;16~55区位一级汉字,按拼音排序;56~87区为二级汉字,按部首、笔画排序;10~15区及88~94区留空。需要注意的是,区位的初始值都是1,和C语言中索引从0开始有差别。在存储上,GB2312采用EUC(Extended Unix Code,按照8位编码表示字符的方法)存储以便兼容于ASCII,其编码具体方式是:采用两个字节存储一个汉字,高字节对应区,低字节对应位,对区和位索引分别加上0xA0便是编码值,因此GB2312的编码范围是0xA1A1~0xF7FE(不包括0x**7F)。例如汉字“闫”的区位索引是0x4326,分别加上0xA0,编码值是0xE3C6;同理,汉字“啊”的区位码0x1601,编码值是0xB0A1。对于加上0xA0的原因,是因为以下两个原因:首先需要绕开控制字符,因此每个字符加0x20,其次,需要和ASCII兼容,因此最高位置1,等于加0x80(2^7=128=0x80);因此每个字符在其区位索引上加0xA0

GBK(汉字内码扩展规范, K即扩展,英文名Chinese Internal Code Specification)WIKI上说,GBK并非国家标准,是GB2312GB13000的过度方案,最初由微软对GB2312扩展而来,向下兼容GB2312。虽然GBK收录了Unicode1.1GB13000中的汉字,但其编码方式并不兼容。至于编码,仍然采用双字节编码方式,高字节从0x81~0xF7,低字节值0x40~0xFE(不包括0x7F),因此GBK的编码空间为24066GBK共收录了21886个字母,空闲2054个码位,全部被映射到UnicodePUA区。

GB13000(GB-13000.1-93,信息技术-通用多八位编码字符集(UCS)第一部分:体系结构与基本多文种平面),等同采用ISO/IEC 10646.1:1993。收集汉字20902个。很遗憾,我没找到资料表明该编码集历史上曾在何处用到。当前,国家标准是GB18030

GB18030(GB19030-2005,信息技术 中文编码字符集)。最新国家标准,与GB2312完全兼容,与GBK基本兼容(除去GBKPUA映射部分则完全兼容),支持GB13000Unicode的全部统一汉字,共收录汉字70244个。GB18030采用多字节编码,有一、二、四字节三种。单字节值0x00~0x7F;双字节值高字节从0x81~0xFE,低字节值0x40~0xFE(不包括0x7F);四字节值最高字节值0x81~0xFE,高字节值0x30~0x39,低字节值0x81~0xFE,最低字节值0x30~0x39。编码空间达到一百六十多万(1611668)

2. 编码转换2:计算机字符显示

以上我们所描述编码集即为内码。计算机为了显示字符,必须将内码映射为字模。字模是字符的位掩码表示方法。例如16*16的矩阵字模,每个字符字模通过16*16=256bits=32bytes来表示。如下汉字“国”的矩阵图:

 (插入图片???????????!!!!!!!太复杂了)

二进制表示如下:

array[16][16]={

            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

            0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0

/* array[2]~array[14] escaped here */

            0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0

};

把任意某种编码集所表示的全部字符的点阵表示按照规定顺序存放,构成点阵字库。而字符的显示过程,则是字模创建的逆过程:字模每位代表显示器上的一个像素点(对于1024*768分辨率的显示器,则有1024*768个像素点),按照字模的二维顺序投影到显示器上,则是字符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值