字符编码

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 代替。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容