因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParameter();方法的时候使用服务器指定的原始编码格式(ISO-8859-1自动解码一次,所以前台编码一次后台解码一次而解码和编码的方式不用所以造成了乱码的出现,

 
这就类似于以下代码:
  1. String name=java.net.URLEncoder.encode("测试", "UTF-8");
  2. System.out.println(name);
  3. System.out.println(java.net.URLDecoder.decode(name, "ISO-8859-1"));

编码后的是%E6%B5%8B%E8%AF%95;
而用ISO-8859-1解码后的是???è?;
 
但是如果调用的是

  1. System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));

则结果是打印“测试”;因为没有经过request.getParameter();方法,所以不会乱码
 
这就印证了 之前为什么我在servlet中调用java.net.URLDecoder.decode(request.getParameter("name"), "UTF-8")方法和调用java.net.URLDecoder.decode(request.getQueryString(), "UTF-8")所得到的结果是不一样的,就是由于在request.getParameter("name")之前会自动做一次解码的工作,而且是默认的ISO-8859-1。
 
所以,在使用java.net.URLEncoder.decode()和java.net.URLDecoder.decode(),的时候需要在前端页面中使用两次java.net.URLDecoder.decode()方法。
 
使用两次编码的过程相当于如下代码:
            
  1. String name=java.net.URLEncoder.encode("测试", "UTF-8");
  2. System.out.println(name);
  3. name=java.net.URLEncoder.encode(name,"UTF-8");
  4. System.out.println(name);
  5. name=java.net.URLDecoder.decode(name, "UTF-8");
  6. System.out.println(name);
  7. System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));

 
输出为:
 
            %E6%B5%8B%E8%AF%95
            %25E6%25B5%258B%25E8%25AF%2595
            %E6%B5%8B%E8%AF%95
            测试
 
第一次编码后将汉字编码为%和字母数字的格式,而第二次编码的时候是对%字母数字进行编码,虽然解码的时候使用的是ISO-8859-1,但是对于%和字母数字而言用ISO-8859-1和UTF-8解码出来的是一样的,此时就回到了汉字被编码过一次的字符串了,当再次进行解码的时候使用UTF-8就回将它转会汉字;

 js的encodeURIComponent 的同理

ps:request.getParameter();方法会自动按照默认ISO-8859-1解码一次,所以要连续UTF-8编码两次,因为第二次UTF-8编码的%和数字与ISO-8859-1解码的结果都是一样的,所以第二次编码是关键





关于 web中 使用 java.net.URLEncoder.encode 要编码两次呢 , js的encodeURIComponent 同理的更多相关文章

  1. web中纯java获取配置文件中的数据

    /*********获取配置文件,但配置文件中的值改变,不会随着值的改变也获取的参数值改变**********/  /**   * 原因是因为,类装载,装载完后,不会再去装载了   * *///  I ...

  2. 为什么java的web开发中URLEncoder.encode方法要为什么要调用两次

    一: 我们先看2个编码的情况 String name=java.net.URLEncoder.encode("测试", "UTF-8"); System.out ...

  3. 中文乱码在java中URLEncoder.encode方法要调用两次解决

    中文乱码在java中URLEncoder.encode方法要调用两次解决 一.场景: 1.我在客户端要通过get方式调用服务器端的url,将中文参数做utf-8编码,需要在js中两次的进行编码,服务器 ...

  4. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...

  5. URL地址中中文乱码详解(javascript中encodeURI和decodeURI方法、java.net.URLDecoder.encode、java.net.URLDecoder.decode)

    引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生了,该如何解决呢?且听本文详细道来. ...

  6. php urlencode vs java URLEncoder.encode

    结论:urlencode 先比URLEncoder.encode多编码 “ * ” 符号,其他都保持一致 php urlencode  phpversion()>=5.3 will compli ...

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

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

  8. 如何判断某String是否经过urlEncoder.encode过

    import java.util.BitSet; public class UrlEncoderUtils { private static BitSet dontNeedEncoding; stat ...

  9. URLEncoder.encode问题

    遇到java里的URLEncoder.encode方法编码后与javascript的encodeURIComponent方法的结果有点不一样,找了一下资料,原来URLEncoder实现的是HTML形式 ...

随机推荐

  1. Anaconda安装Graphviz, mac下Graphviz安装, pcharm中调用pycharm, Graphviz典型例子

    mac下的Graphviz安装及使用 2017年10月13日 13:30:07 阅读数:7495 一.安装 Graphviz http://www.graphviz.org/ mac用户建议直接用ho ...

  2. Wlms进程导致Windows2008R2操作系统关机的解决办法

    2.将wlms进程干掉,将PStooLs工具copy至服务器的C盘根目录下 3.运行psexec.exe -d -i -s regedit.exe 命令 4.打开注册表,找到vlms选项, [HKEY ...

  3. sqlmap原理及使用方法

    1 . 介绍1.1 要求 1.2 网应用情节 1.3 SQL 射入技术 1.4 特点 1.5 下载和更新sqlmap 1.6 执照 2 . 用法2.1 帮助 2.2 目标URL 2.3 目标URL 和 ...

  4. 异常解决:util.NativeCodeLoader: Unable to load native-hadoop library for your platform

    内容源自:点此链接 刚装好hadoop的时候,每次输入命令运行都会出现: WARN util.NativeCodeLoader: Unable to load native-hadoop librar ...

  5. Win8 Metro中文件读写删除与复制操作

    Win8Metro中,我们不能在向以前那样调用WIN32的API函数来进行文件操作,因此,下面就来介绍一下Win8 Metro中文件的读写操作. 1 Windows 8 Metro Style App ...

  6. .gitignore 里面常写的值

    一般用这个文件来控制一些不想提交的内容 这个可以做一个参考 # Windows image file caches Thumbs.db ehthumbs.db   # Folder config fi ...

  7. php遍历文件夹代码实现

    <?php //遍历文件夹 function my_scandir($dir){ $files = array(); if (is_dir($dir)){ if($handle = opendi ...

  8. Vue Router 获取url路径参数 query

    https://router.vuejs.org/zh/api/#路由对象属性 $route.query 类型: Object 一个 key/value 对象,表示 URL 查询参数.例如,对于路径  ...

  9. Java之基础(1) - 编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

  10. tomcat禁用webdav

    在tomcat的web.xml,以及自己项目的web.xml中,均需添加以下内容: <security-constraint> <web-resource-collection> ...