开发者社区 问答 正文

Tomcat乱码问题? 400 报错

Tomcat乱码问题? 400 报错

都说程序员的一生都会被乱码困扰。

在java开发时,遇到过很多次的乱码情况,最终找到了一个比较好的解决方案:修改spring源代码,但是这个方法只针对@ResponseBody返回的数据有效。

对于spring请求乱码,我一直是修改Tomcat的配置文件,不过今天突然想到了:当用户请求到达spring处理之前,Tomcat会默认进行一个编码处理:

URIEncoding :This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

当我知道过后,马上把Tomcat的配置文件注释掉,然后手动进行解码:

System.out.println(new String((name).getBytes(),"GBK"));
		System.out.println(new String((name).getBytes(),"GB2312"));
		System.out.println(new String((name).getBytes(),"UTF-8"));
		System.out.println(new String((name).getBytes(),"ISO-8859-1"));



然而并没有什么乱用,为什么手动解码和配置文件还是不一样呢? 都是转换成UTF-8 。



展开
收起
爱吃鱼的程序员 2020-06-05 12:18:35 634 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    原来你是问这个....

    改成(name).getBytes("ISO-8859-1") 试试

    ######回复 @yumemor : getBytes是编码,new String是解码,你这么理解就对了,如果没有参数则是默认编码(一般是UTF-8)######不好意思,经过我刚刚测试,这种方式能解决 ,能告诉我为什么么? new String((name).getBytes(),"ISO-8859-1") new String(name.getBytes("ISO-8859-1")) 有什么区别呢?######不行的哈,基本所有编码都试过了,不行,上面已经说了######倒是可以考虑用过滤器来解决乱码,post的直接设置编码,get的写一个继承 HttpServletRequestWrapper的类######

    post用过滤器即可

    get请求修改tomcat的server.xml中的<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> 加上URIEncoding="编码" 当然这个编码应该跟你客户端编码一致

    ######

    其实你们都误解了我说的意思,请大家认真看题目好吗? 

    为什么手动解码和配置文件还是不一样呢? 都是转换成UTF-8 。

    ######

    1. 你看下System.out.print(Charset.defaultCharset());值是啥。

    2. System.out.println(new String(name.getBytes("ISO-8859-1"), "ISO-8859-1"));看看能不能行。

    3. 我个人觉得,配置文件和自己解码肯定都是可以解决的。

    ######回复 @yumemor : 其实可以参看URLEncoder,URLDecoder两个类的编码解码的方法,编码的方法调用了getBytes,解码的调用了new String,如果你页面上编码是utf-8,则相当于调用了URLEncoder.encode(str, "UTF-8")这个方法,但tomcat默认是调用URLDecoder.decode(str_utf8, "ISO-8859-1"),所以你可以理解整个过程为new String(str.getBytes("utf-8"),"ISO-8859-1");所以会出现乱码,所以你只要用new String(str.getBytes("ISO-8859-1"),"utf-8");就可以转回来,如果java端默认编码为utf-8,new String(str.getBytes("ISO-8859-1"));也是同样的效果######回复 @maradona : 感谢!###### @yumemor 具体可以参照一下 http://blog.csdn.net/chenssy/article/details/42913511 或许对你有帮助,俺发现对这个理解又透彻了一点点
    2020-06-05 12:18:50
    赞同 展开评论