Java解码encodeURIComp_java中的URLEncoder.encode对应JS中用decodeURIComponent,js和java编码,解码...

本文介绍了Java中的URLEncoder.encode与JavaScript的encodeURIComponent的区别和使用场景,以及如何在Java和JS之间进行正确解码。强调了在Java中使用URLDecoder.decode还原JS编码的字符串,以及decodeURIComponent用于解码Java编码的URI的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用get请求传中文,经常搞到乱码,这几天搞搞这个东西,总结一下,以方便以后处理这类的问题。

Java代码中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,它会将处字母和数字,以及*字符外的都编码成%xx形式。

JS的unescape和decodeURI都不能用来解码JAVA中URLEncoder.encode编码的字符串。

在JAVA代码中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent还原成字符串。

在JAVA代码中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")来将在JS中用encodeURIComponent的参数还原成字符串。

========================================================

1、decodeURI()定义和用法:

decodeURI() 函数可对 encodeURI() 函数编码过的URI 进行解码。

语法:decodeURI(URIstring)

参数 描述:URIstring 必需。一个字符串,含有要解码的 URI 或其他要解码的文本。

返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。

2、encodeURI 方法

将文本字符串编码为一个有效的统一资源标识符 (URI)。

encodeURI(URIString)

必选的 URIString 参数代表一个已编码的 URI。

说明

encodeURI 方法返回一个编码的 URI。如果您将编码结果传递给 decodeURI,那么将返回初始的字符串。encodeURI 方法不会对下列字符进行编码:":"、

"/"、";" 和 "?"。请使用 encodeURIComponent 方法对这些字符进行编码。

-----------------------------------------------------------------------------------------------------------

3、decodeURIComponent()定义和用法:decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。

语法:decodeURIComponent(URIstring)

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

返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。

4、encodeURIComponent() 方法:

把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )。

因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。

========================================================

示例代码如下:

functionfindNE(){

varnd= document.getElementById("NE").value;

nd=encodeURIComponent(encodeURIComponent(nd));

alert(nd);

$.fn.zTree.destroy("netree");

setting.async.url="common/getNeList.action?seachName="+nd;

$.fn.zTree.init($("#netree"), setting);

}

java代码decode

String serchName = request.getParameter("seachName");

System.out.println("serchName1::::::::::::::::::::::"+serchName);if(StringUtils.isNotBlank(serchName)){try{

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

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

}

System.out.println("serchName2::::::::::::::::::::::"+serchName);

在线转码工具http://tool.oschina.net/encode?type=4

escape encodeURI encodeURIComponent的使用和区别

escape(unescape),encodeURI(decodeURI)和encodeURIComponent(decodeURIComponent)都是用来编(解)码字符以利于在网络上传输和解析。

1. escape

把特殊字符(不包括 + - * / . _ @)转化成相应的ASCII表示法(%XX)或者Unicode表示法(%uXXXX)

Javascript代码  b1e2e2b454b46dceba997f20eff62c6d.png

document.write(escape("+-*/._@ '()阳春三月"));

输出结果:

+-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708

从结果中可以看出,+-*/._@不会被编码,空格转成%20,单引号转成%27,圆括号转成%28和%29,四个汉字用Unicode编码成四个%uXXXX序列。

如果我们对escape的字符序列再次调用escape:

Javascript代码  b1e2e2b454b46dceba997f20eff62c6d.png

document.write(escape(escape("+-*/._@ '()阳春三月")));

输出结果:

+-*/._@%2520%2527%2528%2529%25u9633%25u6625%25u4E09%25u6708

可以看出,escape会编码已经escape过的字符%为%25

调用unescape进行解码:

Javascript代码  b1e2e2b454b46dceba997f20eff62c6d.png

document.write(unescape(escape(escape("+-*/._@ '()阳春三月"))));

输出结果:

+-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708

再次调用escape进行解码:

Javascript代码  b1e2e2b454b46dceba997f20eff62c6d.png

document.write(unescape(unescape(escape(escape("+-*/._@ '()阳春三月")))));

输出结果:

+-*/._@ '()阳春三月

所以在编写代码时,要注意被操作字符序列是否已经escape或unescape过。

2. encodeURI和encodeURIComponent

和escape类似,不同的是

a. 它们不会对(' tilde(加在西班牙语n字上的发音符号) ())编码:

Javascript代码  b1e2e2b454b46dceba997f20eff62c6d.png

document.write(encodeURI("+-*/._@ '()"));

输出结果:

+-*/._@%20'()

b. 它们编码Unicode字符也不同,输出为:%XX%XX or %XX%XX%XX

Javascript代码  b1e2e2b454b46dceba997f20eff62c6d.png

document.write(encodeURI("阳春三月"));

输出结果:

%E9%98%B3%E6%98%A5%E4%B8%89%E6%9C%88

encodeURI把每个中文字符都转成了%XX%XX%XX格式

3. encodeURI和encodeURIComponent区别:

encodeURIComponent会编码encodeURI不管的(, / ? : @ & = + $ #),其中,(+ / @)escape也不闻不问

Javascript代码  b1e2e2b454b46dceba997f20eff62c6d.png

document.write(encodeURI(",/?:@&=+$#"));

document.write(encodeURIComponent(",/?:@&=+$#"));

输出结果:

,/?:@&=+$#

%2C%2F%3F%3A%40%26%3D%2B%24%23

总结:

escape是元老级的方法,很多浏览器表示都支持,适用于html字符编码

encodeURI和encodeURIComponent出道较晚,适用于uri字符编码,并且后者对很多URI中可能出现的特殊字符都进行编码

Java中,`URLEncoder.encode` 方法通常用于对URL的参数进行编码,以确保这些参数在通过HTTP GET请求发送时不会因为特殊字符而导致问题。这个方法会将参数转换为`application/x-www-form-urlencoded`格式,即将空格转换为`+`,非ASCII字符转换为`%xx`格式,而保留字母数字字符。 如果你发现通过`URLEncoder.encode`编码后的URL在浏览器中无法访问,可能的原因包括: 1. 编码不正确:确保你对URL的查询字符串部分进行编码,而不是整个URL。如果整个URL都被编码,可能会导致URL格式不正确,因为协议(如http或https)、域名、端口号等部分不应被编码。 2. 特殊字符未正确处理:某些字符可能需要特殊处理,比如在URL中`%`是特殊字符,如果你的参数中包含`%xx`格式的字符,它们可能需要额外的编码或转换。 3. 浏览器或服务器限制:一些浏览器或服务器可能对URL长度有限制。过长的URL可能导致访问失败。 为了确保浏览器可以正常访问通过`URLEncoder.encode`方法编码后的URL,请按照以下步骤操作: - 确认只对URL的查询字符串部分进行编码。 - 检查编码后的URL是否有可访问性问题,比如是否超过了浏览器或服务器的URL长度限制。 - 如果URL中包含`%`字符,需要检查这些字符是否代表了编码后的特殊字符,如果是,则无需进一步编码;如果不是,需要将它们转换为正确的编码格式。 在Java代码中使用`URLEncoder.encode`时的例子: ```java import java.net.URLEncoder; import java.nio.charset.StandardCharsets; public class Main { public static void main(String[] args) { String parameter = "参数"; String encodedParameter = URLEncoder.encode(parameter, StandardCharsets.UTF_8.toString()); System.out.println(encodedParameter); // 输出应该是 "%E5%8F%82%E6%95%B0" } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值