深入分析Java 中的中文編碼問題
阿新 • • 發佈:2019-01-23
QueryString 又如何解析?GET
方式HTTP 請求的QueryString 與POST 方式HTTP 請求的表單引數都是作為Parameters 儲存,都是通過request.getParameter 獲取引數值。對它們的解碼是在request.getParameter 方法第一次被呼叫時進行的。request.getParameter
方法被呼叫時將會呼叫org.apache.catalina.connector.Request 的parseParameters 方法。這個方法將會對GET 和POST 方式傳遞的引數進行解碼,但是它們的解碼字符集有可能不一樣。POST
表單的解碼將在後面介紹,QueryString 的解碼字符集是在哪定義的呢? 它本身是通過HTTP 的Header 傳到服務端的,並且也在URL 中,是否和URI 的解碼字符集一樣呢?從前面瀏覽器對PathInfo
和QueryString 的編碼採取不同的編碼格式不同可以猜測到解碼字符集肯定也不會是一致的。的確是這樣QueryString 的解碼字符集要麼是Header 中ContentType 中定義的Charset 要麼就是預設的ISO-8859-1,要使用ContentType 中定義的編碼就要設定connector
的<Connector URIEncoding=”UTF-8” useBodyEncodingForURI= ”true”/> 中的useBodyEncodingForURI 設定為true。 這個配置項的名字有點讓人產生混淆,它並不是對整個URI 都採用BodyEncoding
進行解碼而僅僅是對QueryString 使用BodyEncoding 解碼,這一點還要特別注意。