用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。

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

示例代码如下:

JavaScript代码encode

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)

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

输出结果:
  +-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708

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

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

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

输出结果:
  +-*/._@%2520%2527%2528%2529%25u9633%25u6625%25u4E09%25u6708

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

调用unescape进行解码:

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

输出结果:
  +-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708

再次调用escape进行解码:

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

输出结果:
  +-*/._@ '()阳春三月

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

2. encodeURI和encodeURIComponent

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

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

输出结果:
  +-*/._@%20'()

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

  1. 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也不闻不问

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

输出结果:
  ,/?:@&=+$#
  %2C%2F%3F%3A%40%26%3D%2B%24%23

总结:
  escape是元老级的方法,很多浏览器表示都支持,适用于html字符编码
  encodeURI和encodeURIComponent出道较晚,适用于uri字符编码,并且后者对很多URI中可能出现的特殊字符都进行编码

java中的URLEncoder.encode对应JS中用decodeURIComponent,js和java编码,解码的更多相关文章

  1. 关于UrlEncode 一团乱麻的问题,后续彻底理解。Java中的 URLEncoder 与 URLDecoder无bug

    很多开放平台都是小白开发的,对这个urlencode理解的不到位,他们总是认为java官方的urlencode有bug,需要 URLEncoder.encode("Hello World&q ...

  2. java中的URLEncoder和URLDecoder类;中文在地址栏中的处理

    [IT168 技术文档] /* 网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a" ...

  3. Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

    错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/S ...

  4. Java 中的 3 个双引号是什么语法?Java 15 刷新你的认知!

    Java 中的 3 个双引号 """ 是什么语法? 这是 Java 15 新出的,刷新你的认知! 一.前言 在 Java 15 的推出的时候,Text Blocks 正式 ...

  5. Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别

    Java的单例模式——饿汉式 package com.swift; //Java单例设计模式——恶汉式 public class SinglePerson { private String name= ...

  6. java中按字节获得字符串长度的两种方法 Java问题通用解决代码

    jdk本身就自带获取字符串字节长度的api了,但字符串如果包含特殊符号或全半角符号或标点符号获取到的结果会有偏差,最好的证据就是新浪微博的字数统计了 // jdk自带的获取字节长度 //注意getBy ...

  7. javaWeb中URLEncoder.encode编码需要调用两次

    今天碰到一个问题,在Controller类中一个方法跳转到该类中的另一个方法,带着中文参数,在跳转之前对该参数进行编码: msg = java.net.URLEncoder.encode(msg,&q ...

  8. JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\)

    JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\) 一.总结 js正则:var patrn=/^[0-9]{1,20}$/; php正则:$pattern='/ ...

  9. 深入分析 Java 中的中文编码问题

    登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Del ...

随机推荐

  1. linux 开机自启动 Tomcat

    1.修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自定的开机启动程序,可以在里面添加想在系统启动之后执行的脚本或者脚本执行命令 2.添加如下内容: exp ...

  2. 内置函数系列之 map

    map(映射函数)语法: map(函数,可迭代对象) 可以对可迭代对象中的每一个元素,分别执行函数里的操作 # 1.计算每个元素的平方 lst = [1,2,3,4,5] lst_new = map( ...

  3. Google Compute Engine VM自动调节

    现象:利用google云搭建VM服务,在搭建实例组有一个"自动调节"功能,可以自动添加/删除MV,当自动添加VM时可能新添加的VM就是一个新的VM,你部署的代码或者环境都没了.现在 ...

  4. 总结 Date 2017.09.23

    总结 Date 2017.09.23 <1>统计数字 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计 ...

  5. BZOJ [Poi2012]Fibonacci Representation

    找最近的数 记忆化 (我也不知道为什么对的) #include<cstdio> #include<algorithm> #include<map> using na ...

  6. 关于我的Android 博客

    我是曹新雨,我为自己代言.现在的菜鸟,3年以后我就是大神.为自己加油.微信:aycaoxinyu 关于我的Android博客,都是我当初遇到困难,克服之后,写上去的.后来,有人加我微信,问我一些问题, ...

  7. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME system variable

    编译的时候出现这个,我从svn download下来的代码,运行就报这个错. 当时我还无知的大吼,怎么可能没有配置java_home, 运行了java -version 都显示出来1.8了. 后来,让 ...

  8. JsBridge "Uncaught TypeError: Cannot call method 'callHandler' of undefined", source

    h5和原生结合开发app越来越流行.其实就是webview 的js调用native的方法.也就是需要搭建一个桥.这样的桥早就有人搭建好了,那就是jsbridge. git地址: https://git ...

  9. async/await 实现协程

    2. 基本了解 在了解异步协程之前,我们首先得了解一些基础概念,如阻塞和非阻塞.同步和异步.多进程和协程. 2.1 阻塞 阻塞状态指程序未得到所需计算资源时被挂起的状态.程序在等待某个操作完成期间,自 ...

  10. javaScript对SEO的影响

    在两大搜索引擎阵营中,大量实践证明百度对JAVASCRIP的处理很不理想而GOOGLE的处理要好一些.   网页中出现大量的JavaScript会给搜索引擎爬行增加难度.其主要影响有以下几点: 1.干 ...