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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM