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