我对Java的URLDecoder有一个问题。我在 JavaScript 中转义字符串,并将其发送到 java servlet。然后我用以下行解码转义的字符串:
URLDecoder.decode(request.getParameter("text"), "UTF-8");
这对于我尝试过的每个特殊字符都适用,唯一产生问题的是“%”。每次我在字符串中使用这个字符时,都会出现以下异常:
java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
java.net.URLDecoder.decode(URLDecoder.java:187)
at.fhv.students.rotter.ajax.count.CountServlet.doGet(CountServlet.java:31)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
这是一个已知的错误吗?还是真的是我的错?
这不是一个错误。您发送了错误的编码字符串。
%
符号必须编码为 %25
如果你调用request.getParameter(),我想你会得到一个解码后的字符串。
我们在 Angular 应用程序中遇到了类似的问题,我们在客户端代码中对
%
符号进行了一次编码。当我们在 servlet 中收到值时,由于 request.getParameter()
,它已经被解码。由于我们的服务器端代码中已经有 URL 解码器,因此对 %
符号进行两次解码会导致 "URLDecoder: Incomplete trailing escape (%) pattern"
异常。我们发现我们根本不应该将 %
作为一个值进行编码和解码来面对这个问题。
为了获取我写的参数
String requestURL=request.getQueryString();
这样它就会给我们参数。由此我们可以使用
String.substring()
来获取固定长度或单个参数的首选参数。然后
String decodeValue = URLDecoder.decode(value,"UTF-8");
也将获得首选字符串编码%符号。
即使我遇到了类似的问题,也解决了。以下是示例代码,您只需运行即可重现并解决此问题。
public class TestPercentage {
public static void main(String[] args) {
// TODO Auto-generated method stub
String transResult = "Se si utilizza DHCP%2C i valori validi sono S%C3%AC o No.%24%23%24%23%24%23%25NICyUSEWINS%25%24%23%24%23%24%23Se si utilizza WINS%2C i valori validi sono S%C3%AC o No.%24%23%24%23%24%23%25NODEFULL%25%24%23%24%23%24%23Nome completo del computer%24%23%24%23%24%23%25NODENAME%25%24%23%24%23%24%23I primi 8 caratteri del nome effettivo del computer%24%23%24%23%24%23%25NWCONTEXT%25%24%23%24%23%24%23Nome contesto NetWare%24%23%24%23%24%23%25NWSERVER%25%";
String decode = null;
try {
decode = URLDecoder.decode(transResult, "UTF-8");
} catch (UnsupportedEncodingException ue) {
System.out.println("UnsupportedEncodingException ! = " + ue);
} catch (IllegalArgumentException ile) {
System.out.println("IllegalArgumentException ! = " + ile);
if (transResult.endsWith("%")) {
transResult = transResult.substring(0, transResult.lastIndexOf("%"));
System.out.println("transResult2 = " + transResult);
try {
decode = URLDecoder.decode(transResult, "UTF-8");
} catch (UnsupportedEncodingException ue2) {
System.out.println("UnsupportedEncodingException 2 = " + ue2);
} catch (IllegalArgumentException ile2) {
System.out.println("IllegalArgumentException ! = " + ile2);
}
}
}
System.out.println("decode = " + decode);
}
}
它不像以“%”结尾的字符串,即使字符串包含%也会面临同样的问题