1、ASCII码
每个字符用1个字节(8bit)去表示,一种单字节字符集。主要用于显示英文的,标准的ASCII字符总计有128个字符(2^7),其中前面32个控制字符,后面96个是可打印字符,包括常用的大小写字母数字标点符号等。因为只占用了一个字节的后7位,那字节的最高位一般设置为0。
2、GB2312(中文编码)
每个中文用2个字节,一种多字节字符集。后续因为不断的扩展,如繁体字和各种符号,甚至少数民族的语言符号等等,又使用了包括GBK等不同字符集。(小于127的字符的意义与标准ASCII码相同)
3、Unicode码
是国际组织制定的,用于收纳世界上所有文字和符号的字符集方案。
码点
Unicode 规定了每个字符的数字编号,这个编号被称为 码点(code point)。
码点以 U+hex 的形式表示,U+是代表Unicode的前缀,而 hex 是一个16进制数。取值范围是从 U+0000 到 U+10FFFF。
每个码点对应一个字符,绝大部分的常见字符在最前面的 65536 个字符,范围是 U+0000到U+FFFF。
一般汉字的码点区间为 U+2E80 - U+9FFF。
字符平面
目前的Unicode分成了17个编组,也称平面,每个平面有65536个码点。
第一个平面是基本多语言平面,范围:U+0000 - U+FFFF,多数常见字符都在该区间。
其他平面则为辅助平面,范围:U+10000 到 U+10FFFF,如我们在网上常见 Emoji 表情。
码元
码元(Code Unit)可以理解为对码点进行编码时的最小基本单元,码元是一个整体。而字符编码的作用就是将Unicode码点转换成码元序列。
Unicode常用的编码方式有 UTF-8 、UTF-16 和 UTF-32,UTF是Unicode TransferFormat的缩写。
UTF-8是8位的单字节码元,UTF-16是16位的双字节码元,UTF-32是32位的四字节码元。
UTF-8是一种可变长度的字符编码方式。目前是使用 1 到 4 个字节来编码字符。
是互联网时代应用最广的一种编码方式,前端接触的相对最多。
需要注意的是:汉字一般占3个字节,表情符号一般占4个字节。
UTF-16的编码方式:基本平面的字符占用 2 个字节(U+0000到U+FFFF),辅助平面的字符占用 4 个字节(U+010000到U+10FFFF)。
也就是说,UTF-16的编码长度要么是2个字节要么是4个字节。当为2字节时,则实际上是与Unicode相同。
UTF-32是定长的编码,每个码位使用四个字节进行编码。优点是和unicode一一对应,缺点是太浪费空间。
TextEncoder,使用 UTF-8 编码将代码点流转换成字节流。
TextDecoder:解码。
默认编码方式就是UTF-8,可以解决字符转UTF-8编码的问题。
let textEn = new TextEncoder()
let enText = textEn.encode('好')//接受一个字符串作为输入,返回一个包含 UTF-8 编码的文本的Uint8Array
let textDe = new TextDecoder()
let deText = textDe.decode(enText)//返回一个字符串,其中包含使用特定 TextDecoder 对象的方法解码的文本
URL的UTF8编解码
JavaScript提供了四个URL的编码/解码方法,可以用于将非ASCII码的字符,如中文字符、特殊字符、表情字符等,进行UTF-8的编解码操作
encodeURI() 和 decodeURI()
encodeURIComponent() 和 decodeURIComponent()
这里的转换方式:先转为UTF-8的字节码,然后在每个字节码前面加个 % 符号进行拼接得到编码结果。 它们的短处也很明显,对ASCII字符如英文数字等字符则无法处理。
encodeURI('好')// '%E5%A5%BD'
encodeURIComponent('好')//'%E5%A5%BD'
encodeURIComponent会对这些URL元字符进行编码,但是encodeURI则不会:
分号(;),逗号(’,’),斜杠(/),问号(?),冒号(:),at(@),&,等号(=),加号(+),美元符号($),井号(#)。
escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
使用 unescape()方法对字符串进行解码。
注意:escape() 函数已经从 Web 标准中删除,所以尽量不使用该函数,可以使用 encodeURI或encodeURIComponent 代替。