在各種開放平台、OpenAPI越來越多之時,用戶端軟體或多或少的在通過HTTP、HTTPS協議與伺服器互動。這其中一個常見的情況就是要求對URL進行encode處理,以保證中文、特殊字元的正確傳遞。不過這個小小的encode也沒想象中的那麼單純。
前幾日在Android開發中遇到一例時,URL中的空格符(ASCII碼是0x20),在經過java.net.URLEncoder類encode以後,會變成+號,而不是%20,從而造成了server不能正確識別。
經查,URLEncode有兩個方法:
public static String encode (String s,String charsetName)
Encodes s using the Charset named bycharsetName.
public static String encode (String s)
Equivalent to encode(s, "UTF-8").
第二個方法已經從Android API 1起就被棄用了,建議使用第一種方法顯示的指定字元集為UTF-8,並且該編碼是將空格符編碼為+,而不是%20。當然,這是符合URL規範的,見RFC-1738。
要想將空格符編碼為%20,就要用另一種encode,即android.net.Uri類,該類使用RFC-2396標準。文法如下:
public static String encode (String s)
Encodes characters in the given string as'%'-escaped octets using the UTF-8 scheme. Leaves letters ("A-Z","a-z"), numbers ("0-9"), and unreserved characters("_-!.~'()*") intact. Encodes all other characters.
當進行網路相關的介面實現時,還是要認真瞭解具體的區別,同時也建議開放平台的文檔中能盡量清晰的描述協議約定,以免給開發和調試帶來困難。試想,如果不是恰巧發現了這個問題,得經過多少測試才能發現這個bug呢?
至於URL與URI的區別,參見百度百科吧。
——歡迎轉載,請註明出處 http://blog.csdn.net/caowenbin ——