js编码
- 我们都知道计算机中所有的数据都是由二进制组成,每个二进制都是0和1两种状态,因此8个二进制位就可以组成256种状态,就是一个字节,在js中一个英文字母为1个字节,中文为两个字节,通过string.length可以输出
ASCII编码
- ASCII编码是诞生于美国针对英文推出的编码方式,对于英文来说256个字符足够用了,但是对于中文甚至其他语言是不够的,所以就有了Unicode编码
Unicode编码
- 它是一个很大的集合,现在的规模可以容纳100多万个符号,它规定了每个符号的二进制代码,但是却没有实现如何存储,那么后来就有了一些实现的方法,比如常用的utf-8
utf-8是目前使用最为广泛的编码形式之一
- 它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的
- 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码
- Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
----------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
搬来的总结(点击查看原文)
- 中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。
- 汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。
- 中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
- 每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。
- 终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
- UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以
说说现在流行的emoji表情
- 毫不例外,emoji也是由unicode编码的,比如😀,在ES5中,js是不支持unicode大于65535的字符的,它会识别成两个字符,在ES6中可以通过\u{}的写法来标识,不管大于65535还是小于都是支持的
- 在js内部,字符是以utf-16存储的,每个字符固定两个字节,16进制小于ffff,10进制小于65535,js对于unicode编码大于这些的字符,需要用4个字节来存储,但是js不识别,还是用两个字符来存储,emoji表情要用codePointAt代替charCodeAt来转化
//获得字符的unicode编码 '0'.charCodeAt() //48 '0'.codePointAt() //48 "😀".codePointAt().toString(16) // "1f600" //将unicode编码转换成我们认识的字符 String.fromCodePoint(0x1f600) // "😀" String.fromCharCode(0x0030) // 0 //简写 "\u0030" // 0 "\u{30}" // 0 "\u{1f601}" //"😀" unicode的最佳写法 在ES6中 //正则匹配 var reg=/[\u4e00-\u9fa5]/ //匹配中文 var reg1=/[\u4e00-\uffff]/ //试着匹配emoji(讲道理是false) reg1.test("😀") //但是结果是true var reg2=/[\u{4e00}-\u{ffff}]/u //大括号是位数,后面加u表示匹配unicode reg2.test("😀") //结果是false //用这种方式可以过滤和规避一些意外输入等