• URLDecoder异常Illegal hex characters in escape (%)


    URLDecoder对参数进行解码时候,代码如:

    URLDecoder.decode(param,"utf-8");
    

    有时候会出现类似如下的错误:

    URLDecoder异常Illegal hex characters in escape (%)

    这是因为传参有一些特殊字符,比如%号或者说+号,导致不能解析,报错

    解决方法是:

    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;
       }
    

    URLDecoder源码:

    public static String decode(String s, String enc)
            throws UnsupportedEncodingException{
    
            boolean needToChange = false;
            int numChars = s.length();
            StringBuffer sb = new StringBuffer(numChars > 500 ? numChars / 2 : numChars);
            int i = 0;
    
            if (enc.length() == 0) {
                throw new UnsupportedEncodingException ("URLDecoder: empty string enc parameter");
            }
    
            char c;
            byte[] bytes = null;
            while (i < numChars) {
                c = s.charAt(i);
                switch (c) {
                case '+':
                    sb.append(' ');
                    i++;
                    needToChange = true;
                    break;
                case '%':
                    /*
                     * Starting with this instance of %, process all
                     * consecutive substrings of the form %xy. Each
                     * substring %xy will yield a byte. Convert all
                     * consecutive  bytes obtained this way to whatever
                     * character(s) they represent in the provided
                     * encoding.
                     */
    
                    try {
    
                        // (numChars-i)/3 is an upper bound for the number
                        // of remaining bytes
                        if (bytes == null)
                            bytes = new byte[(numChars-i)/3];
                        int pos = 0;
    
                        while ( ((i+2) < numChars) &&
                                (c=='%')) {
                            int v = Integer.parseInt(s.substring(i+1,i+3),16);
                            if (v < 0)
                                throw new IllegalArgumentException("URLDecoder: Illegal hex characters in escape (%) pattern - negative value");
                            bytes[pos++] = (byte) v;
                            i+= 3;
                            if (i < numChars)
                                c = s.charAt(i);
                        }
    
                        // A trailing, incomplete byte encoding such as
                        // "%x" will cause an exception to be thrown
    
                        if ((i < numChars) && (c=='%'))
                            throw new IllegalArgumentException(
                             "URLDecoder: Incomplete trailing escape (%) pattern");
    
                        sb.append(new String(bytes, 0, pos, enc));
                    } catch (NumberFormatException e) {
                        throw new IllegalArgumentException(
                        "URLDecoder: Illegal hex characters in escape (%) pattern - "
                        + e.getMessage());
                    }
                    needToChange = true;
                    break;
                default:
                    sb.append(c);
                    i++;
                    break;
                }
            }
    
            return (needToChange? sb.toString() : s);
        }
    
  • 相关阅读:
    vba中数据类型
    Excel统计函数COUNTIF()的常规用法介绍
    分类求和
    在每个sheet的相同位置写入相同的值
    Timer函数
    数组总结
    如何制作本地yum源
    HDFS的优缺点
    HDFS安全模式
    HDFS的HA(高可用)
  • 原文地址:https://www.cnblogs.com/mzq123/p/11516150.html
Copyright © 2020-2023  润新知