文字的编码问题

我们需要将文字保存在磁盘上,但磁盘上只能存储0和1(实际上是存储介质的两种状态),不能存储文字,这就出现了一个问题,如何将文字转换为二进制数字串?

文件的编码/解码就是解决文字<=>二进制串这一环节如何相互转换的问题。

简单地说,GBK和Unicode分别是一种码表,也就是为每一个字符指定一个两个字节组成的代码,例如 “汉”字的Unicode编码为0x6C49,GBK编码为0xBABA(0x是一个字头,表示后面的是16进制字串)。

Unicode编码 Unicode由ISO(国际标谁化组织)制定,它虽然解决了各种语言之间转换的难题,但也有问题,首先是不论什么字符都2个字节表示,网络上英文信息占大部分,由此造成的空间浪费很可观,其次是 Unicode不兼容ASCII编码方案,为了解决这些问题,出现了 UTF-8方案。

Unicode到UTF-8的转换方法详见 字符编解码的故事 。

GBK编码 GBK编码规则:《汉字内码扩展规范(GBK)》( 全国信息技术标准化技术委员会 ): 01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序。 每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”,用这个字的区、位号加上0xA0就得到了对应的字节码。例如“啊”字是 第16区第1个字,所以 区位码是 1601 , 编码方法:0xA0+ 16 = 0x B0 , 0xA0+ 1 = 0x A1 ,所以得到“啊”的 字节码 B0A1 ,可以用UltraEdit查看字符的字节码验证。

GB2312是GBK的早期版本,能表示6000个汉字,由于容量较小,现已被GBK取代。

解码过程

在Windows系统中打开文件时,使用猜的方式选择解码方案。如果文件开头使用了FEFF或FFFE,就认为是Unicode/UTF-8编码,否则为ANSI编码,在中文系统下,就是用GBK解码。GBK解码时,如果一个字节大于 0x7F( 127),就证明这个字节与后面的字节组成了一个汉字,由于汉字的字节码总大于0xA0,英文字节码总小于 0x7F ,因此二者泾渭分明,不会混淆。

用猜的方式确定文件的编码方案绝大多数情况下没有问题,但凡事总有特例,详见 字符编解码的故事 对“联通”编码/解码过程的说明。

原文地址:https://www.cnblogs.com/darkmatter/p/3606846.html