URLDecoder:转义 (%) 模式中的非法十六进制字符 - 对于输入字符串:“</”

新手上路,请多包涵

我在尝试从我的应用程序生成 .PDF 文件时遇到此异常。

 URLDecoder: Illegal hex characters in escape (%) pattern - For input string:....

这是堆栈跟踪

java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "</"
    at java.net.URLDecoder.decode(Unknown Source)


这是代码

StringBuffer outBuffer = new StringBuffer();
//some values are added to outBuffer .
String pdfXmlView = URLDecoder.decode(outBuffer.toString(), "utf-8");

在尝试使用 URLDecoder.decode() 解码时,它抛出了该异常。我得到了异常的原因,这是因为 outBuffer 中的 % 字符。

如果有人知道如何解决这个问题?

原文由 subhashis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

我找到了这个异常背后的原因。 请参阅此链接以获取 URLDecoder

所以在打电话之前 URLDecoder.decode() 我做了这个……

 public static String replacer(StringBuffer outBuffer) {

    String data = outBuffer.toString();
    try {
        StringBuffer tempBuffer = new StringBuffer();
        int incrementor = 0;
        int dataLength = data.length();
        while (incrementor < dataLength) {
            char charecterAt = data.charAt(incrementor);
            if (charecterAt == '%') {
                tempBuffer.append("<percentage>");
            } else if (charecterAt == '+') {
                tempBuffer.append("<plus>");
            } else {
                tempBuffer.append(charecterAt);
            }
            incrementor++;
        }
        data = tempBuffer.toString();
        data = URLDecoder.decode(data, "utf-8");
        data = data.replaceAll("<percentage>", "%");
        data = data.replaceAll("<plus>", "+");
    } catch(Exception e) {
        e.printStackTrace();
    }
    return data;
}

原文由 subhashis 发布,翻译遵循 CC BY-SA 4.0 许可协议

已接受的答案存在重大问题。被编码的字符中有 % 和 + 符号,因此尽管这有助于字符串中的 % 和 + 字符,但它也不会解码 %20(空格)之类的东西,因为您在解码之前要取出百分比。

一种解决方案是替换 %2B (+) 和 %25 (%)。就像是:

    public static String replacer(StringBuffer outBuffer) {
      String data = outBuffer.toString();
      try {
         data = data.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
         data = data.replaceAll("\\+", "%2B");
         data = URLDecoder.decode(data, "utf-8");
      } catch (Exception e) {
         e.printStackTrace();
      }
      return data;
   }

“+”是一个特殊字符,表示表示多次出现的量词。所以应该使用“\+”

原文由 fanfavorite 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题