详解字符编码

一. 字符编码的由来

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不能处理,这导致了后来GBKGB 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编码。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335