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: "

Вопрос:

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

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

Спасибо.

Лучший ответ:

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

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

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

Ответ №2

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

Ответ №3If 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; }

Оцените статью
Добавить комментарий