原创

字符集与进制


  • 计算机底层是二进制的机器码,那么人类的语言文字如何能"翻译"成计算的能执行的二进制呢?

  • 二进制可以看作是主观的高低势的电平,为了让自然语言中的各个符号例如abcd,0123,和标点符号之类的字符能让计算机处理,就必须建立这么一个标准码来"翻译"成计算机能识别的二进制数,于是规定计算机最小的单位:byte(字节) = 8bit(位), 1字节可以组合出 256 种状态。如果这 256中状态每一个都对应一个符号,就能通过1字节的数据表示 256个字符,于是美国人民把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上00x10,终端就换行,遇上0x07,终端就向人们嘟嘟叫,例好遇上0x1b,打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0x20以下的字节状态称为"控制码"。又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。这个方案叫做ANSI的ASCII编码(American Standard Code for Information Interchange,美国信息互换标准代码)。世界上所有的计算机都用同样的ASCII方案来保存英文文字。

  • 后来计算机遍布全世界,中文的编码问题出现了,ASCII编码解决了英文的编码问题,英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的(从0000000到11111111),于是中国人民搞了一个自己的编码集GBK。这样哪行,湾湾人民也不服输,搞了个BIG5编码集。这下就很麻烦了,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号,如果用不同的编码方式打开的话就会乱码。

  • 没有一个武林盟主统一,大家自然是谁也不听谁的,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失,终于一个叫ISO(国际标准化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"

  • UNICODE编码 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是ISO就直接规定必须用两个字节(也就是16位)来统一表示所有的字符,也就是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号,而对于ASCII里的那些"半角"字符,UNICODE包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于"半角"英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

  • Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

  • UTF-8字符集

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。这里的关系是,UTF-8是Unicode的实现方式之一。 UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8的编码规则很简单,只有两条:

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

这样既解决了乱码问题,又合理的利用了存储。

  • 非字符数据的编码问题

  • 对于可显示的字符,人类已经有了非常多的编码方式和字符集来对应显示,但是对于图片,视频这类非字符数据,字符集都会有乱码问题(不是所有二进制编码都有对应的可显示字符,只有二进制是字符才能正常显示),那么我们可以转为16进制,使用Base64编码进行保存。
基础
计算机组成原理
  • 作者:管理员(联系作者)
  • 发表时间:2020-03-19 10:28
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 微信公众号

    评论

    留言