當一個請求以HTTP方式傳輸參數的時候,會進行字符轉義
--瀏覽器對漢字的通過某種編碼方式進行url編碼轉義,轉譯成爲ascii以便下一步。這裏就是get post請求涉及到的地方,get肯定url編碼轉義,post中的urlencode與之類似,formdata猜測應該未轉義,json猜測應該url編碼;
如一個相應信息中含有‘%’的時候
event_name=龍虎榜&estimate_name=日漲幅偏離值達到7% |
轉化代碼爲:
String jsonResponse = URLDecoder.decode(responseBufferString, "UTF-8");
報錯信息爲:
java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern at java.net.URLDecoder.decode(URLDecoder.java:187) |
出現這個錯誤的主要原因是,在接收字段aMoney的值時,瀏覽器傳過來的是這樣的:
%E6%97%A5%E6%B6%A8%E5%B9%85%E5%81%8F%E7%A6%BB%E5%80%BC%E8%BE%BE%E5%88%B07% |
我們知道中文的話,瀏覽器肯定會轉碼,但是轉碼後的格式一般都是%兩個字符
,也就是百分號後面,接英文字母或者數字!
但是假設參數中原本就有百分號%
的話,這時瀏覽器不會處理,接着再使用decode
進行解碼時,會出錯,因爲java程序
認爲後面應該還有兩個字符纔對,結果沒有。。。
解決辦法
只需要把單獨出現的%替換成轉碼後的字符就行了,也就是%25。
這裏強調下,網上很多的改法如下:
estimateName = estimateName.replaceAll("%", "%25");
上面這種寫法是錯誤的,因爲其把正確的都替換掉了。
這裏我們需要明白,要替換掉的是單獨出現的百分號,而不是全部的百分號
正確改法
estimateName = estimateName.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
上的字符串就會解碼成如下格式(重點看最後):
%E6%97%A5%E6%B6%A8%E5%B9%85%E5%81%8F%E7%A6%BB%E5%80%BC%E8%BE%BE%E5%88%B07%25 |
講解下%(?![0-9a-fA-F]{2}):
這是個正則表達式,含義是:不匹配%後面兩位爲數字或字母(包括大小寫)的字符;這樣就把正確的排除掉了,剩下的就是需要匹配替換的。
原文:https://blog.csdn.net/u013066244/article/details/79552732