美文网首页javascript
前端常用的url编码方式

前端常用的url编码方式

作者: YINdevelop | 来源:发表于2019-05-17 17:32 被阅读0次

1.为什么需要编码?

一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址"http://www.abc.com",但是没有希腊字母的网址"http://www.aβγ.com"(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定(只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。)

这意味着,如果URL中有汉字或者其他特殊字符,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给浏览器自己决定。这导致不同浏览器对特殊字符的编码方式不同。

举个例子:

我在谷歌浏览器输入http://www.baidu.com?a=测试,可以发现查询字符串,测试已经被编码成 %E6%B5%8B%E8%AF%95

20190517101910.png

参考阮一峰老师文章关于URL编码,里面介绍使用ie8会出现编码结果不同,由于我的电脑没有ie8,所以没法测试。不过我试了360、搜狗,和谷歌测试的结果一样。
而火狐直接显示的是中文:

20190517105233.png

上面只是统一操作系统的浏览器,如果不同操作系统等,肯定会出现其他编码方式。所以我们在使用url的时候需要一个统一的编码方式(即使用Javascript先对URL编码,不用浏览器自己来编码。因为Javascript的输出总是一致的,服务器获取查询参数等数据,再用对应的解码函数进行解码)

2.网络中常见的编码方式

Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起。

1. escape() / unescape()

规则:除了ASCII字母、数字、标点符号"@ * _ + - . /"以外,对其他所有字符进行编码(注:空格会被转化为+字符)

注:

  1. escape用来对某个字符串进行编码的,不能直接用于url编码,尽管url也是个字符串。所以如果你需要编码整个URL,那么用decodeURI()是专门着眼于对整个url进行编码的。
  2. ECMAScript v3 反对使用escape()方法,现在已经很少使用,应用使用 decodeURI() 和 decodeURIComponent() 替代它

2. encodeURI() / unencodeURI()

  • 用途:encodeURI()是Javascript中真正用来对URL编码的函数。

  • 规则:不会对下列字符编码 ASCII字母 数字 ~ ! @ # $ & * ( ) = : / , ; ? + '(注:这是单引号,若果双引号"会被编码%22)进行编码

  • 结果:输出utf-8形式,并且在每个字节前加上%。

3.encodeURIComponent() / encodeURIComponent

  • 用途:与encodeURI()的区别是,它用于对URL的组成部分(如查询参数、路径等)进行个别编码,而不用于对整个URL进行编码。

  • 规则: 不会对下列字符编码 ASCII字母 数字 ~ ! * ( ) '(注:这是单引号,若果双引号"会被编码%22)进行编码

  • 结果:和encodeURI一样,输出utf-8形式,并且在每个字节前加上%。

3.区别

  • encodeURIComponent比encodeURI编码的范围更大,即 @ # $ & = : / , ; ? +,这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码
  • 如果只是编码字符串,不和URL有半毛钱关系,那么用escape。当然该方法已经不推荐使用,所以不用深究
  • encodeUR用于编码整个URL
  • encodeURIComponent用于编码url中的查询参数或路径等(若参数为url,还是相当于参数,用encodeURIComponent()

4.测试

console.log(encodeURI("http://www.w3school.com.cn"))
console.log(encodeURIComponent("http://www.w3school.com.cn"))
console.log(encodeURI("http://www.w3school.com.cn/My first/"))
console.log(encodeURI('"'))
console.log(encodeURIComponent('"'))
console.log(encodeURI("http://www.w3school.com.cn?t="+encodeURIComponent('http://www.w3school.com.cn')))


输出:

http://www.w3school.com.cn
http%3A%2F%2Fwww.w3school.com.cn
http://www.w3school.com.cn/My%20first/
%22
%22
http://www.w3school.com.cn?t=http%253A%252F%252Fwww.w3school.com.cn

参考文章

阮一峰老师文章关于URL编码

简单明了区分escape、encodeURI和encodeURIComponent

相关文章

  • 前端常用的url编码方式

    1.为什么需要编码? 一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世...

  • iOS - 程序加固APP安全防护

    常用的加固方式 URL编码加密 对iOS app中出现的URL进行编码加密,防止URL被静态分析 本地数据加密 对...

  • URL编码方法

    很多时候我们需要对url进行编码来进行传输,常用的对url编码的方式有2种encodeURI encodeURIC...

  • Web 相关编码和转义

    常用编码 URL 编码 HTML 编码 JS 编码 URL编码 一般来说,URL只能使用英文字母(a-zA-Z)、...

  • python加密

    字符串与bytes binascii binascii模块以更合适的方式展示16进制的字节 URL编码 URL编码...

  • java笔记2-servlet-web应用程序基础知识

    学习目标 URL,URN与URI URL编码,这个常用! 何谓容器? Servlet与jsp的关系 MVC/Mod...

  • swift-url编解码

    url的编码与解码,在工程中很常用,编解码针对特殊字符及中文,确保url可以正常访问

  • Base64编码URL参数注意

    Base64编码后的字符,常用来作为URL参数传递。但有些情况下,编码后可能出现字符+和/,在URL中就不能直接作...

  • 【URL的编码解码】为什么要编码

    编码方式 解码方式 encodeURIComponent()与encodeURI()的区别是,它用于对URL的组成...

  • ROR(47)url编码与Base64编码的区别

    URL 编码 Base64 编码的区别 1 url编码 1.1 什么是 url 编码 型如/url/?%E5%B9...

网友评论

    本文标题:前端常用的url编码方式

    本文链接:https://www.haomeiwen.com/subject/fgnoaqtx.html