跳到主要内容

前端字符编码

字符集和字符编码

字符集就是字符的集合,如常见的 ASCII 字符集,GB2312 字符集,Unicode 字符集等。这些不同字符集之间最大的区别是所包含的字符数量的不同。

在前端开发中,Javascript 程序是使用 Unicode 字符集,Javascript 源码文本通常是基于 UTF-8 编码。 但 js 代码中的字符串类型是 UTF-16 编码的,这也是为什么会碰到 api 接口返回字符串在前端出现乱码,因为多数服务都使用 utf-8 编码,前后编码方式不一致。

说起字符集的发展历程,可以总结为一句话:几乎都是对 ASCII 字符集的扩展。

ASCII

ASCII 就是基于拉丁字母、主要用于显示英文的一种单字节字符集

URL 的 UTF8 编解码

JavaScript 提供了四个 URL 的编码/解码方法,可以用于将非 ASCII 码的字符,如中文字符、特殊字符、表情字符等,进行UTF-8的编解码操作:

  • encodeURI() 和 encodeURIComponent()
  • decodeURI() 和 decodeURIComponent()

很明显,这些方法对ASCII 字符如英文数字等字符无法处理。

这两者的不同之处,在于对部分 URL 元字符符号的处理上。

URL 元字符: ;, ,, /, ?, :, @, &, =, +, $, #

encodeURIComponent 会对这些 URL 元字符进行编码,但是 encodeURI 则不会:

encodeURIComponent(';,/@&=') // '%3B%2C%2F%40%26%3D'
encodeURI(';,/@&=') // ';,/@&='