URL 编码

为什么要对 URL 编码

1. 避免解析错误

我们的 queryString 的形式是使用 ?开始, key=value 传递参数, key-value pairs 之间使用 & 连接.
比如:

?postid=5038412&t=1450591802326

服务器会

根据 & 解析 key-value pairs
根据 = 解析 key,value

那么如果 key或者 value 中存在 =,&, 那么就会解析挂掉,
比如 宝洁公司叫做 P&G


?name=P&G&t=123456

服务器解析的时候就会解析错误:


name=P
G     //到这里就挂掉了

2. 避免非法字符

URL 只能使用 ASCII 字符集, 所有的非 ASCII 码都算是非法字符.
在这个定义中, 所有的中文都算是非法字符.

URL 的编码规则

一般使用的是 百分号编码(percent-encoding)

规则:

是否是 ASCII 字符是取对应的字节编号, 比如 'a' 对应的是 '0x61', 那么编码之后就是 %61否使用 utf-8 对其进行编码比如"中文"使用UTF-8字符集得到的字节为 0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87".

实际情景

浏览器会默认给 URL 编码, 但是不同浏览器的编码实现方式不一致, 所以最好的方式就是:
我们自己通过 JS 对 URL 进行编码

JS 用来编码的函数有 3 个:

// escape()  // 不推荐使用, 原因不明.
encodeURI()
encodeURIComponent()

encodeURI 会对整个 URL 中的非法字符编码 (它是为了解决非法字符)
encodeURIComponent 会对所有的保留字都编码 (解决解析错误的问题)

所以最终的编码方式是:

  1. 对每一个 key-value 进行 encodeURIComponent 编码

  2. 对整个 URL 进行 encodeURI 编码

备注:
URL 中的字符可以分成三类:
保留字符 (reserved characters):
这类字符是URI中的保留关键字符,它们用于分割URI中的各个部分。
这些字符是: ;, /, ?, :, @, &, =, +, $, ,
Mark字符 (mark characters)
这类字符在RFC-2396中特别定义,但是没有特别说明用途,可能是和别的RFC标准相关。
这些字符是:-, _, ., !, ~, *, ', (, )
普通字符

URL 编码解码的问题
既然浏览器会默认给 URL 进行编码, 那么服务器就会默认给URL 解码。
如果我们仅仅是对 URL 进行 encodeURI, 那么服务器在解码的时候可以正常, 但是解析的时候依旧不能
区分 & 到底是分割符还是 value 中的一个普通字符, 所以我们需要对 key-value pairs 进行编码的.

最终结论
使用 encodeURIComponent 避免参数解析错误
使用 encodeURI 避免非法字符

JS 中 URL 编码的问题.相关推荐

  1. JS中URL编码参数(UrlEncode)

    网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数. 参数parameter由于用类似URL的形式传过去 , 所以别直接就那样赋值 以下 ...

  2. JS中URL编码解码

    编码:encodeURI   解码:decodeURI 编码:encodeURIComponent  解码:decodeURIComponent 转载于:https://www.cnblogs.com ...

  3. JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent(转)

    在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误.在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原 ...

  4. js对url编码与解码

    在前端工作中,偶尔会遇到url的编码与解码,比如:在微信授权登录的时候,需要将url进行编码写入,再比如:在PC端显示小表情的时候,会用到对url解码解析表情.那么,有哪些编码解码方式呢,常用的是哪些 ...

  5. php html url编码,html中url编码是什么?有什么用?

    本篇文章给大家带来的内容是介绍HTML中的URL编码是什么,有什么用.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 我们在介绍URL编码之前,首先来了解一下URL是什么,URL的相 ...

  6. js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解

    1 escape()函数 定义和用法escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法escape(string) 参数 描述string 必需.要被转义或编码的 ...

  7. js html url编码,js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考. 代码如下 复制代码 Function str2asc(strs ...

  8. php中url编码地址栏,php url地址栏传中文乱码解决方法集合_PHP

    php地址栏传中文$_GET下来后乱码,urlencode和urldecode用法详解 url编码 语法: string urlencode(string str); 返回值: 字符串 函数种类: 编 ...

  9. JS中URL编码方法的比较

    URL编码方法的比较 Posted by zeal on 2005-08-31 17:35 , 860 characters |  + 1 - 0   English 转载请保留本行原始出处声明信息 ...

最新文章

  1. 医疗行业的AI应用,要避免“垃圾进、垃圾出”
  2. 以下不是python文件读写方法的是-使用Python进行二进制文件读写的简单方法(推荐)...
  3. java中的日期时间的计算与比较
  4. 无刷电机和有刷电机的详解区别
  5. Java Hashtable keySet()方法与示例
  6. UINavigationController 基本用法
  7. 双十一,不玩盖楼,直接大额降价!
  8. 国土空间规划数据汇交标准_国土空间规划数据治理指南来了
  9. c语言制作贪吃小白入门,小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)...
  10. windows进程中的内存结构
  11. oppo android版本升级失败,oppo怎么刷机以及刷机失败的原因
  12. zoom在win7上安装失败
  13. iOS开发:如何修改app名称
  14. 百分点大数据技术团队:Cesium技术在智慧应急行业的应用
  15. AirPods Pro 一直断线?如何修复
  16. 计算机弹出虚拟U盘,怎么设置vmware虚拟机U盘启动
  17. 五、椒盐排骨(Pepper Salt Spareribs)
  18. 红外摄像机应用原理与常见技术问题分析
  19. 003Visual Basic装饰模式
  20. 基于直方图的图像全局二值化算法原理、实现--基于谷底最小值的阈值

热门文章

  1. C#学习笔记8:HTML和CSS基础学习笔记
  2. 【Arduino】开发入门教程【一】什么是Arduino
  3. 祝贺《WCF邮件通信系统》在高阳市场研究汇编第五期发表
  4. 【leetcode】二叉树与经典问题
  5. Web的桌面提醒(Popup)
  6. 调用系统中的默认EMAIL程序
  7. Shiro源码学习之二
  8. 结构体中定义函数指针
  9. 提高C++性能的编程技术笔记:构造函数和析构函数+测试代码
  10. 【AI】caffe使用步骤(四):训练和预测