2022-12-15 编码

  1. 基本概念

Encoding意思是“编码”,与其对应的是Decoding,即“解码”。计算机为什么要进行“编码”和“解码”呢?

我们知道,计算机以二进制形式来传输数据,每一个二进制位(bit)有0和1两种状态。无论从键盘输入,还是读取一个文件,计算机处理的内容其实都是一堆二进制序列。计算机想要读取一些内容,进行处理,然后重新显示到屏幕上,就必须按照某种特定的规则进行编码和解码。例如,把字符'A'存入计算机时,计算机会用"01100001"二进制字符串来表示和处理该字符;读取时,再将"01100001"还原成字符'A'。

字符集(Charset):系统支持的所有字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符集(如字母表或音节表),与其他东西的集合(如号码或电脉冲)进行配对。通常人们用自然语言来表达信,而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。简单来说,编码、解码就是在做翻译工作。将人类理解的自然语言翻译成为计算机理解的二进制数的过程称为“编码(Encoding)”;将这些二进制数重新转化为自然语言的过程称为“解码(Decoding)”,解码,是编码的逆过程。

  1. 常见字符集与编码

常见字符集包含:ASCII、GB2312、BIG5、GB18030、Unicode等。每一种字符集都有对应的编码标准。

2.1 ASCII码
在计算机中,所有数据在传输、存储和处理时,都用二进制数来表示,这是因为计算机分别用高电平和低电平表示1和0。我们将一个二进制位称为一个bit,每个bit有 0 和 1 两种状态。8个二进制位(bit)被称为一个字节(byte)。因此,一个字节可以用来表示 28 = 256 种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是美国制定的基于拉丁字母的一套电脑编码系统,主要用于显示英语和其他西欧语言。它是现今最通用的单字节编码系统。ASCII 码使用指定的7位或8位二进制数组合来表示 27 = 128 或 28 = 256 种可能的字符。

2.1.1 标准ASCII码
标准ASCII码也叫基础ASCII码,标准ASCII码字符集主要包括:

控制字符(回车键、退格、换行键等)

英文大小写字符

阿拉伯数字

标准ASCII字符编码只占用一个字节的后7位,最前面一位统一规定为0。用来表示所有的大小写字母,数字0到9、标点符号,以及控制字符。其中:

0 ~ 31 及 127 是控制字符或通信专用字符。如:LF(换行)、CR(回车)、BS(退格)等

32是空格

48 ~ 57 为0到9十个阿拉伯数字

65 ~ 90 为26个大写英文字母

97 ~ 122 为26个小写英文字母

其余为一些标点符号、运算符号等


image.png

ASCII码排序:数字的ASCII码 < 大写字母的ASCII码 < 小写字母的ASCII码。

2.1.2 扩展ASCII码
英语用128个符号编码就够了,但是其他语言,128个符号远远不够。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号,这样就可以表示最多256个符号。扩展ASCII码就是从128 到 255(0x80-0xff)的字符。扩展ASCII码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

针对扩展的ASCII码,不同的国家有不同的字符集,所以它并不是国际标准。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。

2.2 GBXXXX
计算机发明后很长一段时间,只用应用于一些西方发达国家,ASCII就能够满足需要。但当计算机在中国兴起之后,必须设计一套编码规则来对汉字进行编码。

2.2.1 GB2312
GB2312 或 GB2312–80 是简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。

GB2312字符集共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。

把扩展ASCII码中127号之后的符号去掉,GB2312字符编码规则如下:

小于127的字符的意义与标准ASCII码相同,称为半角字符

两个大于127的字符连在一起时,就表示一个汉字,前一个字节(高字节)从0xA1到 0xF7,后一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的全角字符

GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。但对于人名、古汉语等方面出现的罕用字和繁体字,GB2312仍然不能处理,因此后来GBK及GB18030汉字字符集相继出现以解决这些问题。

2.2.2 GBK
GBK(Chinese Internal Code Specification),汉字内码扩展规范。GBK 共收入 21886 个汉字和图形符号,其中包括GB2312 中的全部汉字、非汉字符号。

GBK 采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。GBK 编码区分三部分:


image.png

① 汉字区 包括:

GBK/2:OXBOA1-F7FE, 收录 GB 2312 汉字 6763 个,按原序排列

GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个

GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字8160个

② 图形符号区 包括:

GBK/1:OXA1A1-A9FE,除 GB 2312 的符号外,还增补了其它符号

GBK/5:OXA840-A9AO,扩除非汉字区

③ 用户自定义区

GBK 区域中的空白区,用户可以自己定义字符

2.2.3 GB 18030
GBK只为“技术规范指导性文件”,不属于国家标准。国家质量技术监督局于2000年3月17日推出了GB 18030-2000标准,以取代GBK。GB 18030-2000除保留全部GBK编码汉字,在第二字节把能使用范围再度进行扩展,增加了大约一百个汉字及四位元组编码空间,但是将GBK作为子集全部保留。

GB18030主要有以下特点:

采用变长多字节编码,每个字可以由1个、2个或4个字节组成

编码空间庞大,最多可定义161万个字符

支持中国国内少数民族文字,不需要动用造字区

汉字收录范围包含繁体汉字以及日韩汉字

GB18030算得上是一种Unicode的变换格式(UTF),但和UTF-8相比要复杂得多。GB18030包含三种长度的编码:单字节的ASCII、双字节的GBK(略带扩展)、以及用于填补所有Unicode码位的四字节UTF区段。

2.3 Unicode
要想打开一个文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么你发给别人的文件会变成乱码?就是因为发送者和接收者的编码方式不一样。

ASCII码的问题在于,尽管在0-127号字符的使用上达成了一致,但对于128-255号字符,各个语言却对其有不同的解释。汉字等亚洲语言就更糟心了,一个字节不够用,开始使用两个字节来存储。

那么问题来了,到底有没有一种编码标准,囊括世界上所有语言的字符集?如果每一个符号都给予一个独一无二的编码,那么乱码问题就会得到彻底的解决。没错,Unicode标准字符集诞生了。

Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,基于通用字符集(Universal Character Set)的标准来发展。到目前为止,Unicode 就已经包含了超过十万个字符。

目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有216 = 65536 个码位,共1114112个。然而目前只用了少数平面。


image.png

基本多文种平面(Basic Multilingual Plane, BMP),或称第0平面或0号平面(Plane 0),是Unicode中的一个最常用的编码区段。编码从U+0000至U+FFFF。以下是Unicode基本多文种平面的示意图。每个写着数字的格子代表256个码点。


image.png

UCS-2是指用两个字节对应一个字符的字符集;UCS-4则是指用四个字节对应一个字符的字符集。我们可以认为,目前为止Unicode有两个具体的字符集:UCS-2和UCS-4。

Unicode 只是一个庞大的、全球通用的字符集,每个字符在Unicode字符集中都能找到唯一确定的编号(字符码,又称Unicode码),但在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,Unicode的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。

UTF包括UTF-7、UTF-8、UTF-16和UTF-32,后面的数字代表转换时最小的位数,比如,UTF-8就是用几个8位二进制数来代表一个Unicode编码。当下两个最流行的Unicode实现是UTF-8 和 UTF-16。

2.3.1 UTF-8
如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,以 8 bit为一个编码单位,使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8是在互联网上使用最广的一种Unicode的实现方式。

UTF-8 的编码规则:

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

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

下表总结了编码规则,字母x表示可用编码的位。


image.png

跟据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

2.3.2 UTF-16
尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前65535个以外的字符。因此,就有了另外一种Unicode编码方式,叫做UTF-16(因为16位 = 2字节)。UTF-16将0–65535范围内的字符编码成2个字节。其编码方法是:

如果字符编码U小于0x10000,也就是十进制的0到65535之内,则直接使用两字节表示;

如果字符编码U大于0x10000,由于UNICODE编码范围最大为0x10FFFF,从0x10000到0x10FFFF之间 共有0xFFFFF个编码,也就是需要20个bit就可以标示这些编码。用U'表示从0-0xFFFFF之间的值,将其前 10 bit作为高位和16 bit的数值0xD800进行 逻辑or 操作,将后10 bit作为低位和0xDC00做 逻辑or 操作,这样组成的 4个byte就构成了U的编码。

  1. HTTP中的字符编码

在HTTP中,与字符集和字符编码相关的消息头包含:Accept-Charset Accept-Encoding Accept-LanguageContent-Type Content-Encoding Content-Language:

Accept-Charset:浏览器申明自己接收的字符集,如:gb2312,utf-8。通常我们说Charset包括了相应的字符编码方案

Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法,如:gzip,deflate

Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等

Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如:Content-Type: text/html; charset=‘gb2312’

Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip

Content-Language:WEB服务器告诉浏览器自己响应的对象的语言。

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