我们都知道计算机只认识0和1,那么面对人类各种复杂的语言符号该如何通过0和1表示呢?没错,正是字符编码。本文将简单介绍计算机中常用的各类字符编码。
ASCII
ASCII使用7位或者8位二进制数组合来表示128或者256种可能的字符。标准的ASCII码使用7位二进制数来表示所有的英文大小写字母、数字(0-9)、标点符号以及特殊控制字符,剩下的最高位为用作奇偶校验位,其中: 0~31及127是控制字符或通信专用字符,比如换行、回车、删除等。 32~126是可显示字符。48~57为数字(0-9);65~90为英文大写字母;97~122为英文小写字母;其余为一些标点符号、运算符等。 用8位二进制数组合表示的称为扩展ASCII码,后128个字符表示特殊字符、外来语字母和图形字符。
latin1
latin1是单字节编码,向下完全兼容ASCII编码,在此基础上增加了很多特殊的符号,包括阿拉伯和希腊符号。
Unicode
由于ASCII码只能表示英文,存在局限性,Unicode为每种语言的每个字符都设定了统一并且唯一的二进制编码。这个时候一个字节显然是不够的,所以Unicode通常用两个字节表示。
UTF-8
虽然Unicode可以表示几乎全世界的语言,但是仍然无法表示一些古老的文字,同时Unicode在表示ASCII可以表示的字符时并不高效(浪费高字节的内存),为了解决这个问题,就出现了一些中间格式的字符集,称为通用字转换格式,即UTF,常见的有UTF-8、UTF-16等。因此UTF-8时一种可变长度的字符编码。
Base64
Base64是一种用64个字符来表示任意二进制数据的编码方法。Base64一般用于HTTP协议下的二进制数据传输,由于HTTP是文本协议,不能直接传输二进制数据,需要转化为字符数据。至于为什么不直接用ASCII码,可能是因为ASCII中有很多制表符、空格、换行等不显示的字符吧。
Hex
hex是直接把二进制数据的每个字节编码为两个十六进制字符。 URL编码采用的就是此方式,不过在字符前需要再加上‘%’。
Escape/Unescape
escape采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。重点:在字符编码前加%。
EncodeURI/DecodeURI
对于ASCII的字符编码与Escape相同,其余部分字符则先将unicode字符按照utf-8对其进行编码,然后在字符编码前加%。
EncodeURIComponent/DecodeURIComponent
与EncodeURI基本类似,只是不需要编码的字符范围不同。具体如下:
escape(69个):*/@+-._0-9a-zA-Z
encodeURI(82个):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
encodeURIComponent(71个):!'()*-._~0-9a-zA-Z
在浏览器内部,可以推导如下公式:
// 在浏览器内部
encodeURIComponent(str) = escape(unicodeToUTF8(str));
unicodeToUTF8(str)=unescape(encodeURIComponent(s));
function unicodeToBase64(str){
return window.btoa(unescape(encodeURIComponent(str)))
}
Buffer
Buffer不属于字符编码,它代表的是二进制数据类型,一般用于表示编码字符的序列。