tomcat亂碼緣由--基本的編碼問題

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

相關文章
相關標籤/搜索