Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 13793|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2025-3-18 14:43
  • 签到天数: 805 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    73万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    731050
    发表于 2021-4-24 11:13:55 | 显示全部楼层 |阅读模式

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

    一、场景:
    1、我在客户端要通过get方式调用服务器端的url,将中文参数做utf-8编码,需要在js中两次的进行编码,服务器端才能用decode方法一次获取。
    例如:
    1. var xing=encodeURIComponent(encodeURIComponent(xing));  

    2、如果我在客户端用java输出汉字作为参数,并且用http协议,也是需要两次才能在服务器端正常的一次decode
    1. xing=URLEncoder.encode(xing,"UTF-8");  
    2. xing=URLEncoder.encode(xing,"UTF-8");  

    服务器端只需要一次decode xing=URLDecoder.decode(xing, "UTF-8");



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

    这就类似于以下代码:

               
     
         
    String name = java.net.URLEncoder.encode( " 测试 " , " UTF-8 " );
    System.out.println(name);
    System.out.println(java.net.URLDecoder.decode(name,
    " ISO-8859-1 " ));

    编码后的是%E6%B5%8B%E8%AF%95。。
    而用ISO-8859-1解码后的是???è?。。

    但是如果调用的是
     
         
    System.out.println(java.net.URLDecoder.decode(name, " UTF-8 " ));

    则结果是打印“测试”。

    这就印证了 之前为什么我在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()方法。

    使用两次编码的过程相当于如下代码:
    复制代码
     
         
    String name = java.net.URLEncoder.encode( " 测试 " , " UTF-8 " );
    System.out.println(name);
    name
    = java.net.URLEncoder.encode(name, " UTF-8 " );
    System.out.println(name);
    name
    = java.net.URLDecoder.decode(name, " UTF-8 " );
    System.out.println(name);
    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就回将它转会汉字。

    总结


    也可以使用"URLEncoder.encode(URLEncoder.encode( ****,"UTF-8"),"UTF-8")"
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-4-21 19:05 , Processed in 0.057453 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表