在解決亂碼問題之前要先了解編碼集的概念
編碼集:
1、作用:讓數字與字元產生對映關係
2、不同的編碼集能對映的字元也不同
3、不同的編碼集中相同的字元可能對應的數字也不一樣
**演示產生亂碼的原因
public class demo1 ;
string str2 = new string(b3, "utf-8");
system.out.println(str2);// 結果是:中
// 用gbk編碼表將位元組轉換成字元
string str3 = new string(b3, "gbk");
system.out.println(str3);// 結果是:涓?
inputstream in=new fileinputstream("test.txt");
byte buffer=new byte[1024];
int length=in.read(buffer);
string str4 = new string(buffer,0,length,"utf-8");
system.out.println(str4);
/*場景2:編碼集不一樣,但是沒有亂碼
比如預設gbk的eclipse向預設utf-8的mysql中寫入中文資料,不會產生亂碼
因為mysql自己做了處理:
eclipse(gbk): "中" ------ [-42,-48]
mysql:1、將位元組按照gbk編碼表轉換成字元new string([-42,-48],"gbk") ----"中"
2、將"中"按照utf-8 解析成位元組[-28, -72, -83];
3、儲存解析後的位元組*/}
}
總結:由於操作字元時,編碼不統一造成亂碼現象
1、伺服器響應時出現亂碼問題,
eclipse採用的是utf-8的編碼,tomcat伺服器預設的是iso-8859-1編碼,瀏覽器預設的是gbk編碼,如下圖所示:
注意: 以字元為標準傳輸資料時,會產生資料丟失,資料丟失就會編碼失敗,進而亂碼
2、伺服器請求時出現亂碼問題解決方式protected void doget(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception
注意:
response呼叫setheader時,預設呼叫了setcharacterencoding方法,所以在程式中,可以省略設定伺服器編
碼集的方法。
//告訴tomcat不要使用預設的iso-8859-1 而是使用utf-8//post方式解決亂碼
request.setcharacterencoding("utf-8");
string word = request.getparameter("word");
system.out.println("word"); //控制台列印「中」
//get方式解決亂碼
byte bytes = request.getparameter("word").getbytes("iso-8859-1");
string str=new string(bytes,"utf-8");
system.out.println(str); //控制台列印「中」
瀏覽器請求響應瀏覽器和伺服器會做什麼
瀏覽器 伺服器1.首先使用者在瀏覽器輸入url位址 2.瀏覽器會解析這個url位址並且返回這個位址的網域名稱和埠 3.瀏覽器會先檢查瀏覽器的快取檔案中找是否有這個網域名稱,返回ip 如果沒有執行4 4.瀏覽器向dns發起系統呼叫請求 這個時候dns會先在系統的快取檔案和hosts檔案尋找是否有這個網...
再說瀏覽器與伺服器響應流程
當我們在瀏覽器中輸入了乙個url位址 如www.cnblogs.com 從等待到頁面顯示的過程中,後台究竟發生了什麼處理呢?一.解析網域名稱位址為ip位址 瀏覽器dns快取 以chrome為例,在瀏覽器視窗中輸入chrome net internals dns,就可以檢視當前瀏覽器dns快取記錄,c...
瀏覽器請求響應的過程
我們在瀏覽器輸入 之後知道頁面展示,那麼其中的過程是什麼樣子呢 下面我們從http tcp ip講解一下 1.當使用者在瀏覽器輸入之後 dns會解析這個網域名稱,把解析到的ip給客戶端 這裡為什麼要解析網域名稱呢,因為計算器識別不了網域名稱只能識別ip 但是人類的記憶對於數字不是很好,網域名稱是為了...