《深入分析javaweb技術(shù)內(nèi)幕》第三章
瀏覽器會(huì)自動(dòng)對(duì)url進(jìn)行編碼,不同瀏覽器用的編碼集不同,可進(jìn)行設(shè)置。
tomcat默認(rèn)是用iso-8859-1對(duì)uri和get參數(shù)進(jìn)行解碼,所以如果這個(gè)過(guò)來(lái)的get參數(shù)是用的utf-8編碼的,到了服務(wù)器端tomcat用iso8859-1解碼就會(huì)出現(xiàn)亂碼。
好像tomcat8默認(rèn)用的是utf8,get請(qǐng)求中文不會(huì)亂碼。
修改tomcat配置的解決方法:
修改配置文件server.xml <conntect URIEncoding="UTF-8"/>,用utf-8對(duì)uri解碼。
tomcat對(duì)get參數(shù)解碼用的編碼集,要么是Header的ContentType定義的charset,要么是默認(rèn)的ISO-8859-1。
設(shè)置useBodyEncodingForURI=true使tomcat使用ContentType的charset。這個(gè)屬性是表示對(duì)get參數(shù)使用BodyEncoding進(jìn)行解碼而不是對(duì)整個(gè)uri。
不改tomcat配置:
在java中用iso8859-1解碼后用utf-8編碼
key = new String(key.getBytes("iso8859-1"), "utf-8");可以前端兩次編碼uri,到服務(wù)端兩次解碼uri,tomcat一次(ISO-8859-1),手動(dòng)一次(utf-8)。
因?yàn)閷?duì)英文字符來(lái)說(shuō)UTF-8編碼和ISO-8859-1編碼的效果相同。
但是如果有特殊字符,就沒(méi)法得到正確的結(jié)果。
ajax發(fā)請(qǐng)求時(shí)如果用encodeURI()用utf-8編碼,瀏覽器會(huì)不會(huì)干涉再編碼一次?
另外,
在java端處理url編解碼有兩個(gè)類(lèi),URLEncoder和URLDecoder。這兩個(gè)類(lèi)可以將所有“%”加utf-8碼值用utf-8解碼,從而得到原始的字符。