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]
你好