zoukankan      html  css  js  c++  java
  • 文字的编码问题

    我们需要将文字保存在磁盘上,但磁盘上只能存储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 ,因此二者泾渭分明,不会混淆。

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

  • 相关阅读:
    Java调用wcf
    登录重构小记
    从零打造一个Web地图引擎
    Vue动态组件的实践与原理探究
    揭开Vue异步组件的神秘面纱
    使用vue实现排序算法演示动画
    C#转义字符
    asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)
    页面关闭事件onbeforeunload 记录
    执行一段sql
  • 原文地址:https://www.cnblogs.com/darkmatter/p/3606846.html
Copyright © 2011-2022 走看看