Java調用 URLDecoder.decode(str, "UTF-8"); 拋出以上的異常,其主要原因是% 在URL中是特殊字符,需要特殊轉義一下,
上面的字符串中'%'是一個中文字符'是',而轉換的實現是將%后面的兩個字符一起轉為一個16進制數。拿"%是"來轉換數字,肯定會有NumberFormatException異常。
類似的如果請求字符串中有'+',也會有問題。因為'+'被當做空格使用了。
一個解決辦法就是將%替換為%25。
data = data.replaceAll("%(?![0-9a-fA-F]{2})", "%25"); data = data.replaceAll("\\+", "%2B"); data = URLDecoder.decode(data, "utf-8");
這里使用了一個特殊正則表達式:零寬負向先行斷言(zero-width negative lookahead assertion),模式為(?!pattern),代表字符串中的一個位置,緊接該位置之后的字符序列不能匹配pattern。%(?![0-9a-fA-F]{2})意思是'%'開始,但是后面兩個字符不是數字,也不是字母。