1.encodeURIComponent

定义和用法

encodeURIComponent() 函数可把字符串作为 URI 组件进行编码

语法结构

encodeURIComponent(URIstring)

参数描述

URIstring 必需。一个字符串,含有 URI 组件或其他要编码的文本

返回值

URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换

特殊说明

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )

其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的

示例

encodeURIComponent 对应java解码类_decodeURI

2.decodeURIComponent

定义和用法

decodeURIComponent() 函数可把字符串作为 URI 组件进行解码

语法结构

decodeURIComponent(URIstring)

参数描述

URIstring 必需。一个字符串,含有 URI 组件或其他要解码的文本

返回值

URIstring 的副本,其中的某些字符被十六进制的转义序列转换成对应的ACSII字符

特殊说明

使用js的jQuery的post向后台servlet传递拼接的字符串数据时,一些特殊的字符例如:“+、@、#、
$、%、&、?、/”等无法传递到后台输出

示例

encodeURIComponent 对应java解码类_decodeURI_02

3.encodeURI decodeURI

定义和用法
encodeURIdecodeURI 主要用于URL(网址)的编码、解码,是JavaScript的自身函数,采用UTF-8编码格式对指定的字符串进行编码或解码。

  • 编码函数 encodeURI():将非字母、数字 字符转换成ASCII码,以16进制表示
  • 译码函数 decodeURI():将被encodeURI()编码过的 ASCII码转换成对应的字符

语法结构

encodeURI(URIstring)

decodeURI(URIstring)

参数描述

encodeURI(URIstring) → URIstring 必需。一个字符串,含有 URI 或其他要编码的文本

decodeURI(URIstring) → URIstring 必需。一个字符串,含有 URI 或其他要解码的文本

特殊说明

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )

该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#

由于目前各国网页字符集的不同造成了URL编码的多种形式,例如 GBK和UTF 这2种字符集的网页中汉字URL编码方式就不一样

encodeURI编码和decodeURI解码只能针对UTF-8字符集的网页,不能识别GBK网页编码过的汉字编码。

返回值

encodeURI(URIstring) → URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换
decodeURI(URIstring) → URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换

示例

encodeURIComponent 对应java解码类_decodeURI_03

解决JavaScript用encodeURIComponent编码后无法再到后台解码的问题

关于上面提到的: 使用js的jQuery的post向后台servlet传递拼接的字符串数据时,一些特殊的字符例如:“+、@、#、$、%、&、?、/”等无法传递到后台输出问题

对于使用window.self.location传递数据到后台时,有一个特殊情况,就是java中的解码方式:

JavaScript用encodeURIComponent编码后无法再到后台解码的问题
前端JavaScript代码:

window.self.location="index.jsp?data="+encodeURIComponent(url);

后端java代码:

searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8")

咋一看觉的没问题,一编一解的,应该可以了。但还是出现了乱码???

原因:

原来在对后台java程序里的data赋值的时候,本身已经使用了一次解码,不过解码的结果依然不对。所以我们

可以在页面上进行两次编码操作,这样后台自动的那次就可以抵消掉一次,然后在使用

data=java.net.URLDecoder.decode(data,“UTF-8”);进行一次解码就好了

两次编码两次解码的过程为(重点):

UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和解码的过程是对称的,按照这个思路来就不会出现乱码

正确的代码:

根据上面的两次编两次解的思路我们可以这样写 →

前端JavaScript代码:

window.self.location="index.jsp?data="+encodeURIComponent(encodeURIComponent(url));

后端java代码:

searchtext=java.net.URLDecoder.decode(data,"UTF-8");
潜移默化

根据上面的两次编两次解的思路代码我们是不是大概知道原理是什么了对吧,那我们可不可以前端就一次编码呢?完全可以,按照后端默认会进行一次ISO8859-1的解码对吧,那我们直接将这个替换成UTF-8了吗 →

一次编码一次解码的过程为(重点):

UTF-8编码(前端)->UTF-8解码(后端),编码和解码的过程是对称的,按照这个思路来就不会出现乱码

window.self.location="index.jsp?data="+encodeURIComponent(url);

后端java代码:

String s = new String(request.getParameter("data").getBytes("ISO8859-1"), "UTF-8");
结语

上面的总结就这么多,本人小菜哈,如果有错误的话欢迎指正,小弟承蒙各位大佬意见

如果对上面这个两次编码转码还不是很清楚的话,可以看这篇文章哈,转载的挺不错的


希望可以帮到你~