跳至主要內容

编码总结

大约 16 分钟

编码总结

一、Base64编码

1.1 初步认识

下面的这段字符串,应该是大家都很常见的。通过这种固定的格式,来表示一张图片,并被浏览器识别,可以完整的展示出图片:

data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0c......

这里展示的是一个svg格式的图片,当然我们还可以加载任何浏览器支持的格式的图片。

这段字符串就是基于Base64编码得来的,其中base64,后面那一长串的字符串,就是Base64编码字符串。

1.2 Base64是怎么诞生的

互联网发展早起,电子邮件是最有效的应用。而电子邮件的SMTP传输协议在早期,只能用于传送7位的ASCII码,而ASCII码就是基于英语设计的,对于非英语国家的文字等资源就无法发送。为了解决这个问题,后来有了通用互联网邮件扩充MIME,增加了邮件的主体结构,定义了非ASCII码的编码传输规则,这就是Base64

1.3 基础定义

Base64是基于64个可打印字符来表示二进制数据的编解码方式。正因为可编解码,所以它主要的作用不在于安全性,而在于让内容能在各个网关间无错的传输。

这64个可打印字符包括大写字母A-Z、小写字母a-z、数字0-9共62个字符,再加上另外2个 +/。Base64是一种索引编码,每个字符都对应一个索引,具体的关系图,如下:

索引对应字符索引对应字符索引对应字符索引对应字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9G25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

这也是名称中64的由来。

1.4 编码方式

由于64等于2的6次方,所以一个Base64字符实际上代表着6个二进制位(bit)。然而,二进制数据1个字节(byte)对应的是8比特(bit),因此,3字节(3 x 8 = 24比特)的字符串/二进制数据正好可以转换成4个Base64字符(4 x 6 = 24比特)。为什么是3个字节一组呢? 因为6和8的最小公倍数是24,24比特正好是3个字节。

具体的编码方式:

  1. 将每3个字节作为一组,3个字节一共24个二进制位
  2. 将这24个二进制位分为4组,每个组有6个二进制位
  3. 在每组的6个二进制位前面补两个00,扩展成32个二进制位,即四个字节
  4. 每个字节对应的将是一个小于64的数字,即为字符编号
  5. 再根据字符索引关系表,每个字符编号对应一个字符,就得到了Base64编码字符

img

上图中的字符串 'you',经过转换后,得到的编码为: 'eW91'

1.5 体积增大

我们可以看到,当3个字符进行Base64转换编码后,最后变成了4个字符。因为每个6比特位,都补了2个0,变成8比特位,对应1字节。这里正好多了三分之一,所以正常情况下,Base64编码的数据体积通常比原数据的体积大三分之一。这也是为什么我们在前面讲使用Base64编码优化图片时,需要强调是小图标,如果图片都使用该方式,则静态文件会增大很多,并不合适。

1.6 = 等号

3个英文字符,正好能转成4个Base64字符。那如果字符长度不是3的倍数,那应该使用什么样的规则呢?

其实也简单,我们在实际使用Base编码时,常会发现有第65个字符的存在,那就是 '=' 符号,这个等于号就是针对这种特殊情况的一种处理方式。对于不足3个字节的地方,实际都会在后面补0,直到有24个二进制位为止。但要注意的是,在计算字节数时,会直接使用总长度除以3,如果余数为1则会直接在最后补一个=,如果余数为2则补两个=。因此,转码后的字符串需要补的后缀等号,要么是1个,要么是2个,具体的可以见下图:

img

图中第二个,使用的是单独的字符 'd',是为了区分索引字符表里的索引0,这个时候,得到编码中,会存在一个索引0对应的A字符,而'='是直接补上2个。

1.7 非ASCII码字符

由于 Base64 仅可对 ASCII 字符进行编码,如果是中文字符等非ASCII码,就需要先将中文字符转换为ASCII字符后,再进行编码才行。

二、ASCII编码

1、ASCII码 是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646 。在这个页面,你可以找到8位的256个字符、ASCII码表和Windows-1252 (code page 1252,它是国际标准ISO 8859-1的一个扩展字符集) 标准保持一致;

2、ASCII码American Standard Code for Information Interchange 的缩写,而不是ASCⅡ(罗马数字2),有很多人在这个地方产生误解;

3、ASCII码 规范于1967年第一次发布,最后一次更新是在1986年,它包含了33个控制字符(具有某些特殊功能但是无法显示的字符)和95个可显示字符;

ASCII 控制字符 (字符编码: 0-31)

ASCII码表中,前32个字符是不能用于打印控制的编码,而是用于控制像打印机一样的外围设备。

十进制 DEC八进制 OCT十六进制 HEX二进制 BIN符号 SymbolHTML 实体编码中文解释 Description
00000000000000NUL�空字符
10010100000001SOH标题开始
20020200000010STX正文开始
30030300000011ETX正文结束
40040400000100EOT传输结束
50050500000101ENQ询问
60060600000110ACK收到通知
70070700000111BEL
80100800001000BS退格
90110900001001HT	水平制表符
100120A00001010LF
换行键
110130B00001011VT垂直制表符
120140C00001100FF换页键
130150D00001101CR
回车键
140160E00001110SO移出
150170F00001111SI移入
160201000010000DLE数据链路转义
170211100010001DC1设备控制 1
180221200010010DC2设备控制 2
190231300010011DC3设备控制 3
200241400010100DC4设备控制 4
210251500010101NAK拒绝接收
220261600010110SYN同步空闲
230271700010111ETB传输块结束
240301800011000CAN取消
250311900011001EM介质中断
260321A00011010SUB替换
270331B00011011ESC换码符
280341C00011100FS文件分隔符
290351D00011101GS组分隔符
300361E00011110RS记录分离符
310371F00011111US单元分隔符

ASCII 打印字符 (字符编码: 32-127)

32~126(共95个)是字符:32是空格,其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。第127个字符表示的是键盘上的删除命令。

十进制 DEC八进制 OCT十六进制 HEX二进制 BIN符号 SymbolHTML 实体编码中文解释 Description
320402000100000 空格
330412100100001!!感叹号
340422200100010""双引号
350432300100011##井号
360442400100100$$美元符
370452500100101%%百分号
380462600100110&&
390472700100111''单引号
400502800101000((左括号
410512900101001))右括号
420522A00101010**星号
430532B00101011++加号
440542C00101100,,逗号
450552D00101101--连字号或减号
460562E00101110..句点或小数点
470572F00101111//斜杠
480603000110000000
490613100110001111
500623200110010222
510633300110011333
520643400110100444
530653500110101555
540663600110110666
550673700110111777
560703800111000888
570713900111001999
580723A00111010::冒号
590733B00111011;;分号
600743C00111100<<小于
610753D00111101==等号
620763E00111110>>大于
630773F00111111??问号
641004001000000@@电子邮件符号
651014101000001AA大写字母 A
661024201000010BB大写字母 B
671034301000011CC大写字母 C
681044401000100DD大写字母 D
691054501000101EE大写字母 E
701064601000110FF大写字母 F
711074701000111GG大写字母 G
721104801001000HH大写字母 H
731114901001001II大写字母 I
741124A01001010JJ大写字母 J
751134B01001011KK大写字母 K
761144C01001100LL大写字母 L
771154D01001101MM大写字母 M
781164E01001110NN大写字母 N
791174F01001111OO大写字母 O
801205001010000PP大写字母 P
811215101010001QQ大写字母 Q
821225201010010RR大写字母 R
831235301010011SS大写字母 S
841245401010100TT大写字母 T
851255501010101UU大写字母 U
861265601010110VV大写字母 V
871275701010111W&#087大写字母 W
881305801011000XX大写字母 X
891315901011001YY大写字母 Y
901325A01011010ZZ大写字母 Z
911335B01011011[[左中括号
921345C01011100\反斜杠
931355D01011101]]右中括号
941365E01011110^^音调符号
951375F01011111__下划线
961406001100000``重音符
971416101100001aa小写字母 a
981426201100010bb小写字母 b
991436301100011cc小写字母 c
1001446401100100dd小写字母 d
1011456501100101ee小写字母 e
1021466601100110ff小写字母 f
1031476701100111gg小写字母 g
1041506801101000hh小写字母 h
1051516901101001ii小写字母 i
1061526A01101010jj小写字母 j
1071536B01101011kk小写字母 k
1081546C01101100ll小写字母 l
1091556D01101101mm小写字母 m
1101566E01101110nn小写字母 n
1111576F01101111oo小写字母 o
1121607001110000pp小写字母 p
1131617101110001qq小写字母 q
1141627201110010rr小写字母 r
1151637301110011ss小写字母 s
1161647401110100tt小写字母 t
1171657501110101uu小写字母 u
1181667601110110vv小写字母 v
1191677701110111ww小写字母 w
1201707801111000xx小写字母 x
1211717901111001yy小写字母 y
1221727A01111010zz小写字母 z
1231737B01111011{{左大括号
1241747C01111100||垂直线
1251757D01111101}}右大括号
1261767E01111110~~波浪号
1271777F01111111&#127;删除

ASCII扩展码 (字符编码: 128-255)

后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

十进制 DEC八进制 OCT十六进制 HEX二进制 BIN符号 SymbolHTML 实体编码中文解释 Description
1282008010000000欧盟符号
1292018110000001
1302028210000010单低 9 引号
1312038310000011ƒ带钩的 拉丁小写字母f
1322048410000100双低 9 引号
1332058510000101水平省略号
1342068610000110剑号
1352078710000111双剑号
1362108810001000ˆ修正字符 抑扬音符号
1372118910001001千分号
1382128A10001010Š带弯音号的 拉丁大写字母 S
1392138B10001011左单书名号
1402148C10001100Œ拉丁大写组合 OE
1412158D10001101
1422168E10001110Ž带弯音号的 拉丁大写字母 z
1432178F10001111
1442209010010000
1452219110010001左单引号
1462229210010010右单引号
1472239310010011左双引号
1482249410010100右双引号
1492259510010101
1502269610010110半长破折号
1512279710010111全长破折号
1522309810011000˜小波浪线
1532319910011001
1542329A10011010š带弯音号的 拉丁小写字母 s
1552339B10011011右单书名号
1562349C10011100œ拉丁小写组合 oe
1572359D10011101
1582369E10011110ž带弯音号的 拉丁小写字母 z
1592379F10011111Ÿ带弯音号的 拉丁大写字母 Y
160240A010100000&#160;
161241A110100001¡¡反向感叹号
162242A210100010¢¢分币符号
163243A310100011££英磅符号
164244A410100100¤¤
165245A510100101¥¥人民币符号
166246A610100110¦¦
167247A710100111§§章节符号
168250A810101000¨¨通用货币符号
169251A910101001©©版权符号
170252AA10101010ªª阴性顺序 指示符号
171253AB10101011««左角引号
172254AC10101100¬¬
173255AD10101101­&#173;
174256AE10101110®®
175257AF10101111¯¯
176260B010110000°°温度符号
177261B110110001±±加/减号
178262B210110010²²上标 2
179263B310110011³³上标 3
180264B410110100´´
181265B510110101µµ微符号
182266B610110110段落符号, pilcrow
183267B710110111··中点
184270B810111000¸¸
185271B910111001¹¹上标 1
186272BA10111010ºº阳性顺序 指示符
187273BB10111011»»右角引号
188274BC10111100¼¼分数四分之一
189275BD10111101½½分数二分之一
190276BE10111110¾¾
191277BF10111111¿¿反向问号
192300C011000000ÀÀ带重音符 的大写字母 A
193301C111000001ÁÁ带尖锐重音 的大写字母 A
194302C211000010ÂÂ带音调符号 的大写字母 A
195303C311000011ÃÃ带代字号 的大写字母 A
196304C411000100ÄÄ带元音变音 (分音符号) 的大写字母 A
197305C511000101ÅÅ带铃声 的大写字母 A
198306C611000110ÆÆ大写字母 AE 双重元音
199307C711000111ÇÇ带变音符号 的大写字母 C
200310C811001000ÈÈ带重音符 的大写字母 E
201311C911001001ÉÉ带尖锐重音 的大写字母 E
202312CA11001010ÊÊ带音调符号 的大写字母 E
203313CB11001011ËË带元音变音 (分音符号) 的大写字母 E
204314CC11001100ÌÌ带重音符 的大写字母 I
205315CD11001101ÍÍ带尖锐重音 的大写字母 I
206316CE11001110ÎÎ带音调符号 的大写字母 I
207317CF11001111ÏÏ带元音变音 (分音符号) 的大写字母 I
208320D011010000ÐÐ
209321D111010001ÑÑ带代字号 的大写字母 N
210322D211010010ÒÒ带重音符 的大写字母 O
211323D311010011ÓÓ带尖锐重音 的大写字母 O
212324D411010100ÔÔ带音调符号 的大写字母 O
213325D511010101ÕÕ带代字号 的大写字母 O
214326D611010110ÖÖ带元音变音 (分音符号) 的大写字母 O
215327D711010111××大写字母 OE 连字
216330D811011000ØØ带斜杠 的大写字母 O
217331D911011001ÙÙ带重音符 的大写字母 U
218332DA11011010ÚÚ带尖锐重音 的大写字母 U
219333DB11011011ÛÛ带音调符号 的大写字母 U
220334DC11011100ÜÜ带元音变音 (分音符号) 的大写字母 U
221335DD11011101ÝÝ带元音变音 (分音符号) 的大写字母 Y
222336DE11011110ÞÞ
223337DF11011111ßß德语高调 小写字母 s
224340E011100000àà带重音符 的小写字母 a
225341E111100001áá带尖锐重音 的小写字母 a
226342E211100010ââ带音调符号 的小写字母 a
227343E311100011ãã带代字号 的小写字母 a
228344E411100100ää带元音变音 (分音符号) 的小写字母 a
229345E511100101åå带铃声的 小写字母 a
230346E611100110ææ小写字母 ae 双重元音
231347E711100111çç带变音符号 的小写字母 c
232350E811101000èè带重音符 的小写字母 e
233351E911101001éé带尖锐重音 的小写字母 e
234352EA11101010êê带音调符号 的小写字母 e
235353EB11101011ëë带元音变音 (分音符号) 的小写字母 e
236354EC11101100ìì带重音符 的小写字母 i
237355ED11101101íí带尖锐重音 的小写字母 i
238356EE11101110îî带音调符号 的小写字母 i
239357EF11101111ïï带元音变音 (分音符号) 的小写字母 i
240360F011110000ðð
241361F111110001ññ带代字号 的小写字母 n
242362F211110010òò带重音符 的小写字母 o
243363F311110011óó带尖锐重音 的小写字母 o
244364F411110100ôô带音调符号 的小写字母 o
245365F511110101õõ带代字号 的小写字母 o
246366F611110110öö带元音变音 (分音符号) 的小写字母 o
247367F711110111÷÷小写字母 oe 连字
248370F811111000øø带斜杠 的小写字母 o
249371F911111001ùù带重音符 的小写字母 u
250372FA11111010úú带尖锐重音 的小写字母 u
251373FB11111011ûû带音调符号 的小写字母 u
252374FC11111100üü带元音变音 (分音符号) 的小写字母 u
253375FD11111101ýý带元音变音 (分音符号) 的小写字母 y2
254376FE11111110þþ
255377FF11111111ÿÿ
上次编辑于:
贡献者: xuliang