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