计算机编码之ASCII码和unicode码

一、ASCII码

ascii(American Standard Code for Information Interchange),美国信息交换标准代码。

  • 我们都知道,在计算机中,所有的数据在存储和运算时都要使用二进制数表示,计算机只能用高电压和低电压区分1和0,那剩下的数字、字母、标点符号怎么办呢?
  • 每个人都可以制定一个标准,用二进制表示其他的字符,但是,这样无法相互通信,所以美国就制定了一套标准,那就是ASCII码
  • ASCII码最初为7位二进制数,这7位二级制数有128中组合,所以可以表示128个字符
  • 比如 其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
  • 后来随着计算机的发展,128个字符不够用了,国际标准化组织(ISO)又制定了,ASCII拓展码,用8位二进制数表示.8位二进制数有256种组合,所以可以规定256种字符.
  • 尽管之前标准的ASCII码用7位表示字符,但是,规定一个字节是8位,所以会在7位前加一位0
  • 一个字节由8位二进制码表示,一个字母,一个数字,一个符号,都是用一个字节表示

二 、unicode

后来随着计算机的发展,传到了中国,尼玛,我泱泱大国有10左右万汉字,你就256个字符,还不够我塞牙缝呢,于是中国制定了GB2312编码,用两个字节表示一个汉字字符,这样就解决了问题,256*256等于65535所以可以表示常用的汉字了,这就是为啥有的汉字字典上有,但是计算机显示不出来。但是还有很多国家,比如韩国、日本,他们也相继制定,但是,这样每个国家都有自己的编码,如果进行显示他国语言,那么就会出现乱码问题

  • 后来GB2312和ISO不兼容,中国又制定了GBK(国标扩展),向上兼容ASCII码 向下兼容GB2312,而且包含日韩文字
  • 为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
  • Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。
  • 16位二进制去代表一个符号,这样就导致了一个问题,英文编码的空间浪费,因为在ANSI中的符号都是一个字节来表示的,而使用了UNICODE编码就白白浪费了一个字节。也就代表着Unicode需要使用两倍的空间去存储相应的ANSI编码下的符号。虽然现在硬盘或者内存都很廉价,但是在网络传输中,这个问题就凸显出来了,你可以这样想想,本来1M的带宽在ANSI下可以代表10241024个字符,但是在Unicode下却只能代表10241024/2个字符。也就是1MB/s的带宽只能等价于512KB/s,这个很可怕啊。所以为了解决符号在网络中传输的浪费问题,就出现了UTF-8编码,Unicode transfer format -8 ,后面的8代表是以8位二进制为单位来传输符号的,但是这样又导致了一个问题,虽然UTF-8可以使用一个字节来表示ANSI下的符号,但是对于其它类似汉语的符号,得需要两个字节来表示,所以计算机不知道如何去截取一个符号,也就是一个符号对应的二进制的截取开始位置和截取结束位置。所以为了解决Unicode下的ANSI符号的空间浪费和网络传输下如何截取字符的问题,UTF规定:如果一个符号只占一个字节,那么这个8位字节的第一位就为0。如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10,然后如果是三个字节的话,那么第一个字节的前三位为111,第四位为0,剩余的两个字节的前两位都为10。按照这样的算法去思考一个中文字符的UTF-8是怎么表示的:一个中文字符需要两个字节来表示,两个字节一共是16位,那么UTF-8下,两个字节是不够的,因为两个字节下,第一个字节已经占据了三位:110,然后剩余的一个字节占据了两位:10,现在就只剩下11位,与Unicode下的两个字节,16位去表示任意一个字符是相悖的。所以就使用三个字节去表示非ANSI字符:三个字节下,一共是24位,第一个字节头四位是:1110,后两个字节的前两位都是:10,那么24位-8位=16位,刚好两个字节去表示Unicode下的任意一个非ANSI字符。这也就是为什么UTF-8需要使用三个字节去表示一个非ANSI字符的原因了!
  • UTF-8:
Unicode编码(十六进制)   UTF-8 字节流(二进制)
000000-00007F          0xxxxxxx
000080-0007FF          110xxxxx 10xxxxxx
000800-00FFFF          1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF	       11110xxx10xxxxxx10xxxxxx10xxxxxx

在这里插入图片描述

UTF-8最厉害了地方就是可以根据位数自动调整字节数
比如:

  • 0-127 用一个字节表示
  • 128-2047 用2个字节表示
  • 2048-65535 用三个字节表示
  • 65536-1114111 用四个字节表示
    所以,一个汉字用utf-8表示的话,是三个字节
    比如汉字"一",unicode对应码为19968(10进制)—>4e00(16进制)
    二进制为 100111000000000 为15位 用GB2312的话则是在前面加一个0 然后用两个字节,如果用UTF-8的话,则是转换成3个字节.
    因为中文是三个字节,所以,很多时候,中国的文件很多都是GBk编码,

ANSI

其实ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。你的美国同事Bob的系统中ANSI编码其实是ASCII编码(ASCII编码不能表示汉字,所以汉字为乱码),而你的系统中(“汉字”正常显示)ANSI编码其实是GBK编码,而韩文系统中(“한국어”正常显示)ANSI编码其实是EUC-KR编码。

虚构小故事

话说计算机是由美国佬搞出来的嘛,他们觉得一个字节(可以表示256个编码)表示英语世界里所有的字母、数字和常用特殊符号已经绰绰有余了(其实ASCII只用了前127个编码)。后来欧洲人不干了,法国人说:我需要在小写字母加上变音符号(如:é),德国人说:我也要加几个字母(Ä ä、Ö ö、Ü ü、ß)。于是,欧洲人就将ASCII没用完的编码(128-255)为自己特有的符号编码(后来称之为“扩展字符集”)。等到我们中国人开始使用计算机的时候,尼玛,256个编码哪够?我泱泱大中华,汉字起码也得N多万吧,就连小学生都得要求掌握两三千字。国标局最后拍板:一个字节不够,那我们就用多个字节来为汉字编码吧,但是,国情那么穷,字节那么贵,三个字节伤不起,那就用俩字节吧,先给常用的几千汉字编个码,等以后国家强盛了人民富裕了,咱再扩展呗—于是GB2312就产生了。台湾同胞一看,尼玛,全是简体字,还让不让我们写繁体字的活了,于是台湾同胞也自己弄了个繁体字编码—大五码(Big-5)。同时,其它国家也在为自己的文字编码。最后,微软苦逼了:顾客就是上帝啊,你们的编码我都得满足啊,这样吧,卖给美国国内的系统默认就用ASCII编码吧,卖给中国人的系统默认就用GBK编码吧,卖给韩国人的系统默认就用EUC-KR编码,…但是为了避免你们误会我卖给你们的系统功能有差异,我就统一把你们的默认编码都显示成ANSI吧。—本故事纯属虚构,但“ANSI编码”确实只存在于Windows系统。

发布了29 篇原创文章 · 获赞 3 · 访问量 4682

猜你喜欢

转载自blog.csdn.net/weixin_44898301/article/details/102626323
今日推荐