字符编码的详解

来源:互联网 发布:java equals方法代码 编辑:程序博客网 时间:2024/05/21 09:17

一. 字符编码的由来


1.1 计算机是干什么的?

  • 计算机一开始发明出来时是用来解决数字计算问题的,后来人们发现,计算机还可以做更多的事,例如文本处理。
    • 但计算机其实挺笨的,它只“认识”010110111000…这样由0和1两个数字组成的二进制数字,这是因为计算机的底层硬件实现就是用电路的开和闭两种状态来表示0和1两个数字的。因此,计算机只可以直接存储和处理二进制数字。
  • 为了在计算机上也能表示、存储和处理像文字、符号等等之类的字符,就必须将这些字符转换成二进制数字。
    • 当然,肯定不是我们想怎么转换就怎么转换,否则就会造成同一段二进制数字在不同计算机上显示出来的字符不一样的情况,因此必须得定一个统一的、标准的转换规则

1.2 字符编码的诞生

  • 最开始出现了Ebcdic(Extended Binary Coded Decimal Interchange Code扩展二进制编码的十进制交换码)编码标准。
    • EBCDIC码是由国际商用机器公司(IBM)为大型机操作系统而开发设计的,于1964年推出。
    • 在EBCDIC码中,英文字母不是连续排列的,中间出现多次断续,这带来了一些困扰和麻烦。
    • 因此,在后来IBM的个人计算机和工作站操作系统中并没有采用EBCDIC码,而是采用了晚于EBCDIC码推出、且后来成为了英文字符编码工业标准的ASCII编码方案。
  • ASCII码(American Standard Code for Information Interchange美国信息交换标准码),由美国国家标准学会ANSI(American National Standard Institute)于1968年正式制定
    • 由于ASCII码要晚于EBCDIC码出现(网上也有文章说是ASCII码要早于EBCDIC码开始设计,但1968年ASCII码才正式确定为标准),ASCII码的编码方式参照了EBCDIC码,并吸取了其经验教训,将英文字母进行了连续排列,这方便了程序处理。
    • ASCII编码方案虽然不是最早出现的字符编码方案,但却是最基础、最重要、应用最广泛的字符编码方案。目前所通行的其他字符编码方案,比如ISO-8859、GB系列(GB2312、GBK、GB18030、GB13000)、Big5、Unicode等等,均直接或间接兼容ASCII码。

二. ASCII字符编码学习

2.1 ASCII编码的方式

  • ASCII码占用一个字节(8位)
    • 一共可以表示256个字符, 但是128个字符已经足够表示英语中常见的字符符号
    • 因此最高位通常是0, 不表示任意意义的内容, 剩余的7位用来表示常见的字符


  • 详解128个字符
    • 0~31:控制字符或通讯专用字符(不可显示不可打印字符),如0x07(BEL响铃)会让计算机发出哔的一声、0x00(NUL空,注意不是空格)通常用于指示字符串的结束、0x0D(CR回车)和0x0A(LF换行)用于指示打印机的打印针头退到行首(即回车)并移到下一行(即换行)等。
    • 32~126:可显示可打印字符
      • 48~57为0-9的阿拉伯数字
      • 65~90为26个大写英文字母
      • 97~122为26个小写英文字母
      • 其余的是一些标点符号、运算符号等。
    • 127:控制字符DELETE(删除符号)

2.2 写入文件的过程

  • 当将字符编码写入文件时, 系统会写入对应的二进制, 在查看文件时, 会根据二进制查找对应的编码表, 决定真正现实给我们什么样子的内容
    • 比如写入文件时, 65则表示大写字母A
    • 当然数字本身也可以在编码表中查找到对应的编码

三. GBXXXX字符集&编码

3.1 ASCII编码的缺陷

  • ASCII的最大缺点是只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如naïve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)。
  • 而EASCII虽然解决了部份西欧语言的显示问题,但对更多其他语言依然无能为力。因此现在的苹果电脑已经抛弃ASCII而转用Unicode。

3.2 GBXXXX编码

  • 计算机发明之处及后面很长一段时间,只用应用于美国及西方一些发达国家,ASCII能够很好满足用户的需求。但是当天朝也有了计算机之后,为了显示中文,必须设计一套编码规则用于将汉字转换为计算机可以接受的数字系统的数。
  • 著名的GB2312
    • 天朝专家把那些127号之后的奇异符号们(即EASCII)取消掉,规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码
    • GB2312编码通行于中国大陆,新加坡等地。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312, GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。

3.3 GBK编码

  • GB2312基本满足了汉语的需求
  • 但是对于古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现
    • 如部分在GB 2312-80推出以后才简化的汉字(如"啰"),部分人名用字(如中国前总理朱镕基的"镕"字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。
  • 于是于是厂商微软利用GB 2312-80未使用的编码空间,收录GB 13000.1-93全部字符制定了GBK编码(汉字依然占两个字节)。
  • 在中文版Windows操作系统下, 通常使用的编码方式都是GBK编码

三. 伟大的创想Unicode

3.1 Unicode

  • 像天朝一样,当计算机传到世界各个国家时,为了适合当地语言和字符,设计和实现类似GB232/GBK/GB18030/BIG5的编码方案。这样各搞一套,在本地使用没有问题,一旦出现在网络中,由于不兼容,互相访问就出现了乱码现象。
  • 为了解决这个问题,一个伟大的创想产生了——Unicode
    • Unicode编码系统为表达任意语言的任意字符而设计
    • 它使用4字节的数字来表达每个字母、符号,或者表意文字
  • 在计算机科学领域中,Unicode统一码万国码单一码标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统
  • Unicode和UTF-8/UTF-16的关系?
    • 可以这样理解:Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案

3.2 UTF-32

  • 上述使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph),每个数字代表唯一的至少在某种语言中使用的符号的编码方案,称为UTF-32。
  • UTF-32又称UCS-4是一种将Unicode字符编码的协定,对每个字符都使用4字节。就空间而言,是效率非常低的。
  • 因此UTF-32使用并不广泛

3.3 UTF-16

  • 尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前65535个以外的字符
    • 因此,就有了另外一种Unicode编码方式,叫做UTF-16(因为16位 = 2字节)
  • UTF-16编码最明显的优点是它在空间效率上比UTF-32高两倍,因为每个字符只需要2个字节来存储
  • 但是65535以外的字符难免会出现, 如果出现了如何解决呢?
    • 虽然UTF-16也提供了自己的解决方案, 但是我们有更好的选择, UTF-8

3.4 UTF-8

  • UTF-8(8-bit Unicode Transformation Format)是一种针对[Unicode]的可变长度字符编码
    • 它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。
  • UTF-8使用一至四个字节为每个字符编码:
    1. 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
    2. 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)。
    3. 类似汉字通常使用三个字节编码。
    4. 其他极少使用的Unicode辅助平面的字符使用四字节编码。
  • 那么UTF-8的优势就可以提现出来了
    • 不仅仅可以表示几乎所有的文字, 而且也不会过分的占用空间
    • 它逐渐成为电子邮件/网页/其他存储和传输文字的应用中, 优先采用的编码(Mac/iPhone都采用UTF-8编码)
    • 互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。

原创粉丝点击