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