URLDecoder: Недопустимые шестнадцатеричные символы в шаблоне escape (%) - для строки ввода: "</"

Я получаю это исключение, пытаясь сгенерировать файл .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.

Если кто-нибудь знает, как решить эту проблему, пожалуйста, помогите мне.

Спасибо.

Ответы

Ответ 1

Я нашел причину этого исключения. Посмотрите эту ссылку для 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;
}

Ответ 2

Существует серьезная проблема с принятым ответом. Символы, которые получают кодировку, имеют в них знаки% и +, поэтому, хотя это помогает с символами% и + в строке, он также не декодирует такие вещи, как %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;
   }

"+" - специальный символ, обозначающий квантификатор, означающий одно из других вхождений. Поэтому следует использовать "\ +"

Ответ 3

Пожалуйста, проверьте свой ввод в декодере, внешний буфер, который был передан методу декодера, должен быть закодированным значением, тогда эта проблема не будет возникать.

Ответ 4

If you are facing issue only with **%**. Then this would help:

   protected static String encoder(String localTopic1){
        String localTopic =localTopic1;
        try {
            StringBuffer tempBuffer = new StringBuffer();
            int incrementor = 0;
            int dataLength = localTopic.length();
            while (incrementor < dataLength) {
            char characterAt = localTopic.charAt(incrementor);
            int next_char_index = incrementor+1;
            int third_index = next_char_index+1;
            Character charAt_nextIndex = ' ';
            char charAt_thirdIndex = ' ';
            String stringAt_nextIndex = "";

            if(next_char_index < dataLength){
                    charAt_nextIndex = localTopic.charAt(next_char_index);
                    stringAt_nextIndex = charAt_nextIndex.toString();
            }
            if(third_index < dataLength)
                    charAt_thirdIndex = localTopic.charAt(third_index);


            if (characterAt == '%') {
                    if(stringAt_nextIndex.matches("[A-F2-9]")){

                            if(charAt_thirdIndex == ' ' || charAt_thirdIndex == '%'){
                                    tempBuffer.append("<percentage>");
                            }
                            else{
                                    tempBuffer.append(characterAt);
                            }
                    }
                    else{
                            tempBuffer.append("<percentage>");
                    }

            }else {
                    tempBuffer.append(characterAt);
            }
            incrementor++;
    }
    localTopic = tempBuffer.toString();
} catch (Exception e) {
    e.printStackTrace();
}
return localTopic;
}