聊聊javascript里的编码

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
     
     //用这种方式可以过滤和规避一些意外输入等
    复制代码

转载于:https://juejin.im/post/5a619255f265da3e591e5aa6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值