Http傳輸轉碼問題(java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern)

當一個請求以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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章