• URI编码解码和base64


    概述

    对于uri的编解码,在js中有3对函数,分别是escape/unescape,encodeURI/decodeURI,encodeURIComponent/decodeURIComponent。

    它们的适用范围不同,而且遵循的编码规范也不同。

    对于上述函数而言,所有的ASCII的字符编码相同,采用%XX的形式。而对于unicode字符,escape编码形式为%uXXXX,而其余两个函数则先将unicode字符按照utf-8对其进行编码,然后继续进行uri编码(百分号)。对于中文字符,每个字符用urf-8编码则为3个字节,然后在每个字节前面加上%即可。如:‘中国’按照urf-8编码为"0xE40xB80xAD0xE50x9B0xBD",进而对该6个字节进行百分号编码:"%E4%B8%AD%E5%9B%BD"。

     对于base64编码,常常在网络中用于编码长标识符。编码规则是每3个8位字节为一组,分成4组6位字节,并且每个字节的高位补零,形成4个8位的字节。base64编码具有可逆性。在js中,IE10以及w3c浏览器内置了window.btoa()来完成二进制数据或者ASCII字符到base64的转换。但是unicode字符不能使用该函数。

    区别

    这三对函数的安全字符(即不需要编码的字符)范围也不同,如下所示:

    • escape(69个):*/@+-._0-9a-zA-Z
    • encodeURI(82个):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
    • encodeURIComponent(71个):!'()*-._~0-9a-zA-Z

    现在对比encodeURI和encodeURIComponent,从名称上可看出encodeURI是针对整个URI进行编码,我们以特殊的URI--URL来说明下。

    对于URL为http://www.baidu.com而言,如果用encodeURI编码,返回的仍是“http://www.baidu.com”;如果用encodeURIComponent编码,返回的为"http%3A%2F%2Fwww.baidu.com"。

    encodeURI所针对的是整个URI,并不会对分隔符如/,?,=符号进行编码,否则破坏了URI的原有含义,而encodeURIComponent则是针对URI的

    某一部分进行编码,如查询字符串部分的&会被转义。

    base64编码与btoa

    在浏览器内部,encodeURIComponent(s) = escape(unicodeToUTF8(s));

    根据上述公式,可以推出 unicodeToUTF8(s) = unescape(encodeURIComponent(s));然后根据utf-8编码的字符进行base64编码。

      function unicodeToBase64(s){

        return window.btoa(unescape(encodeURIComponent(s)))

      }

      

  • 相关阅读:
    在vs 2012 中使用xna 4.0 做开发!
    MVC如何分离Controller与View在不同的项目?
    Shader Compilation for Multiple Platforms
    文件已损坏,请移至废纸篓的解决办法!
    javascript学习笔记[6]面向对象
    javascript学习笔记[3]流程控制
    [tonyLp]百度地图API开发实践(1)
    javascript学习笔记[7]内建对象
    javascript学习笔记[5]函数(2)
    javascript学习笔记[1]变量
  • 原文地址:https://www.cnblogs.com/accordion/p/4178289.html
Copyright © 2020-2023  润新知