Java變成遇到的簡單亂碼問題
1.亂碼 --- 編碼集
編碼集的本質(zhì)是讓數(shù)字與字符產(chǎn)生一個映射關(guān)系,不同的編碼集映射實(shí)現(xiàn)也不同
比如UTF-8: "中"----> -28 -72 -83 對應(yīng)三個字節(jié)
GBK: "中"----> -42 -48 對應(yīng)兩個字節(jié)
2.亂碼 --- 編碼集(特殊情況)
a.編碼集之間支持的字符不同時,會產(chǎn)生亂碼,比如UTF-8支持中文,使用不支持中文
的ISO-8859-1解析,會出現(xiàn)亂碼
b.編碼集支持的字符相同的情況時,轉(zhuǎn)換字符使用的編碼集是會出現(xiàn)亂碼
3.常見的亂碼場景
a.IO流操作,進(jìn)行流讀取時,數(shù)據(jù)源是GBK編碼集,而程序是UTF-8編碼集,導(dǎo)致亂碼
b.IO流操作,進(jìn)行流寫出時,程序是UTF-8的,默認(rèn)文件默認(rèn)是GBK的,但是竟然沒有亂碼
總結(jié):字符串在不同程序之間進(jìn)行傳輸時,有兩種傳輸依據(jù):
i.以字節(jié)為依據(jù)
A中存儲字符"中"(GBK編碼集 -42 -48),傳輸給B,直接傳輸字節(jié)-42 -48
ii.以字符為依據(jù)
A中存儲字符"中"(UTF-8編碼集 -28 -72 -83),傳輸給B(不管默認(rèn)編碼集),直接按照UTF-8編碼集存儲文字
c.數(shù)據(jù)庫操作:
eclipse使用編碼集GBK,傳輸中文字符"中",到MySQL,而MySQL使用編碼集(UTF-8),MySQL存儲未出現(xiàn)亂碼,
因?yàn)镸ySQL會先使用GBK編碼集將字節(jié)轉(zhuǎn)換成字符,然后再使用UTF-8轉(zhuǎn)化成字節(jié)之后再用UTF-8轉(zhuǎn)換成字符存儲起來
4、JavaWEB 中亂碼問題
響應(yīng):
response.setCharacterEncoding("UTF-8");//告訴Tomcat 使用 UTF-8
response.setContentType("text/html;charset=utf-8");//告訴瀏覽器和 Tomcat 使用 UTF-8 編碼集
請求:
request.setCharacterEncoding("UTF-8");//只適用于 POST
GET 和 POST 通用
byte[] buffer = value.getBytes("ISO-8859-1");//"中"在 UTF-8 中字節(jié)一樣
value = new String(buffer,"UTF-8");//中
地址欄:地址欄有專屬的編碼方式
java.net.URLDecoder;
java.net.URLEncoder;
URLEncoder.encode(s,enc)進(jìn)行編碼
URLDecoder.decode(s, enc)進(jìn)行解碼
鏈接提交到服務(wù)器用到GET方法,因此可以使用GET處理亂碼的方式進(jìn)行解碼
浙公網(wǎng)安備 33010602011771號