POST方式下的特殊字符轉換
隨便說說表單以POST方式提交時,表單元素值中的一些字符也會轉換,但以下不做轉換:+@*_-. ,a-z A-Z 0-9 ,要轉換的字符會先用瀏覽器的編碼方式時行編碼,然后把編碼轉換成%xx(xx為兩位的十六進制)形式參數串后傳送到服務器。
Java中的URLEncoder.encode(String s, String enc) /URLDecoder.decode(String s, String enc)編碼方式
Java中的URLEncoder.encode(String s, String enc) /URLDecoder.decode(String s, String enc)機制:它們與JavaScript中的encodeURI、encodeURIComponent函數在編碼方式上是不一樣的。encodeURI、encodeURIComponent用的是UTF-8,是不能更改的。但Java里的編解碼函數不一定是UTF-8,這里的編碼與運行的環境是有關系的,默認情況下,在Tomcat5.5下是以ISO8859-1來解碼URL中傳遞過來的參數的,但也可以設置URL的編碼方式,比如Tomcat中設置URIEncoding與useBodyEncodingForURI屬性是可以的,具體實例請看《HTTP碼流與Jsp亂碼問題的分析(一)》(http://jiangzhengjun.javaeye.com/blog/508079)中的URLEncoder.encode()部分。
URLEncoder.encode(String s, String enc) 對 String 編碼時,使用以下規則:
字母數字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不變。
特殊字符 "."、"-"、"*" 和 "_" 保持不變。
空格字符 " " 轉換為一個加號 "+"。
所有其他字符都是不安全的,因此首先使用一些編碼機制將它們轉換為一個或多個字節。然后每個字節用一個包含 3 個字符的字符串 "%xy" 表示,其中 xy 為該字節的兩位十六進制表示形式。推薦的編碼機制是 UTF-8。但是,出于兼容性考慮,如果未指定一種編碼,則使用相應平臺的默認編碼。
例如,使用 UTF-8 編碼機制,字符串 "The string ü@foo-bar" 將轉換為 "The+string+%C3%BC%40foo-bar",因為在 UTF-8 中,字符 ü 編碼為兩個字節,C3 (十六進制)和 BC (十六進制),字符 @ 編碼為一個字節 40 (十六進制)。
URLDecoder.decode(String s, String enc) 轉換過程正好與 URLEncoder 類使用的過程相反。假定已編碼的字符串中的所有字符為下列之一:"a" 到 "z"、"A" 到 "Z"、"0" 到 "9" 和 "-"、"_"、"." 以及 "*"。允許有 "%" 字符,但是將它解釋為特殊轉義序列的開始。
轉換中使用以下規則:
字母數字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不變。
特殊字符 "."、"-"、"*" 和 "_" 保持不變。
加號 "+" 轉換為空格字符 " "。
將把 "%xy" 格式序列視為一個字節,其中 xy 為 8 位的兩位十六進制表示形式。然后,所有連續包含一個或多個這些字節序列的子字符串,將被其編碼可生成這些連續字節的字符所代替??梢灾付▽@些字符進行解碼的編碼機制,或者如果未指定的話,則使用平臺的默認編碼機制。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jjjsss82/archive/2009/12/13/4940513.aspx