tomcat乱码缘由:在学习servlet时候,常常会遇到中文乱码的问题,网上查只知道如何设置不乱码,其中的原理不是很明白。我认为明白其中的原理,乱码问题就很容易解决数组
tomcat乱码解决方法:浏览器
post请求:tomcat
request.setCharacterEncoding("utf-8");post
若是不想每一个请求方法里都写就写一个filter过滤器学习
get请求:编码
1.修改tomcat中的server.xml文件spa
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='UTF-8' />code
2.得到参数是经过new String()方法server
String name = request.getParameter("name");
name = new String(name.getBytes("iso-8859-1"),"utf-8");xml
问题: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]你好