tomcat乱码原因--基本的编码问题

tomcat乱码原因:在学习servlet时候,经常会遇到中文乱码的问题,网上查只知道如何设置不乱码,其中的原理不是很明白。我认为明白其中的原理,乱码问题就很容易解决

tomcat乱码解决方法:

post请求:

request.setCharacterEncoding("utf-8");

如果不想每个请求方法里都写就写一个filter过滤器

 

get请求:

1.修改tomcat中的server.xml文件

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='UTF-8' />

 

2.获得参数是通过new String()方法

String name = request.getParameter("name");
name = new String(name.getBytes("iso-8859-1"),"utf-8");

 

问题:tomcat对于get请求使用了ISO-8859-1编码,对post请求默认使用你设置的编码,没有设置就使用默认ISO-8859-1编码。

对post请求设置编码就不会乱码,原理是使用utf-8编码,使用utf-8解码,不使用utf-8解码就会出错如下:

 

String s = new String("你好".getBytes(),"utf-8");
System.out.println(new String(s.getBytes(),"iso-8859-1"));
String s1 = new String(s.getBytes(),"utf-8");
System.out.println(s1);

 

结果:你好

     你好

 

get请求浏览器的编码为utf-8,然而tomcat使用ISO-8859-1进行解码就会乱码,为什么这样可以解决乱码,

是因为ISO-8859-1编码是单字节编码,所以使用s1.getBytes("iso-8859-1")得到的直接数组和之前没有被解码时一样,

所以在使用utf-8就和上面的post一样,只是编码,解码

并不是所有的乱码都可以使用这种方式,只是因为ISO-8859-1编码是单字节编码,获得其字节数组是没有变的,

因为不同的编码对应的字节数是不一样的

String s = new String("你好".getBytes(),"utf-8");
System.out.println(Arrays.toString(s.getBytes()));
//相当于tomcat帮助解码(实际对于开发者又编码一次,所以后面要先获得iso-8859-1编码的字节数组,再转成utf-8编码)
String s1 = new String(s.getBytes(),"iso-8859-1");
//打印iso-8859-1编码的字节数据,与解码前的字节数组比较,发现一样,所以以utf-8编码解码不会乱码
System.out.println(Arrays.toString(s1.getBytes("iso-8859-1")));
String s2 = new String(s1.getBytes("iso-8859-1"),"utf-8");
System.out.println(s2);

 

结果:

[-28, -67, -96, -27, -91, -67]
[-28, -67, -96, -27, -91, -67]
你好

 

转载于:https://www.cnblogs.com/chenxiaocai/p/5420767.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值