Java URLDecoder выдает исключение при использовании строки, содержащей %

У меня проблема с URLDecoder Java. Я избегаю строки в JavaScript и отправляю ее в сервлет Java. Затем я декодирую экранированную строку следующей строкой:

URLDecoder.decode(request.getParameter("text"), "UTF-8");

Это отлично работает для всех специальных символов, которые я пробовал, единственная проблема - это «%». Каждый раз, когда я использую этот символ в строке, я получаю следующее исключение:

java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
    java.net.URLDecoder.decode(URLDecoder.java:187)
    at.fhv.students.rotter.ajax.count.CountServlet.doGet(CountServlet.java:31)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Это известная ошибка? Или это действительно моя ошибка?


person Daniel Rotter    schedule 14.05.2012    source источник
comment
Я избегаю строки в JavaScript. Как? Вы, должно быть, делаете это неправильно.   -  person user207421    schedule 15.05.2012


Ответы (4)


Это не ошибка. Вы отправляете неверную закодированную строку. Знак % должен быть закодирован как %25

Если вы вызовете request.getParameter(), я думаю, вы получите декодированную строку.

person Christian Kuetbach    schedule 14.05.2012

У нас была аналогичная проблема в нашем угловом приложении, где мы один раз кодировали знак % в коде на стороне клиента. Когда мы получили значение в сервлете, оно уже было декодировано из-за request.getParameter(). Поскольку у нас уже был декодер URL-адресов в нашем стороннем коде, двойное декодирование знака % вызывало исключение "URLDecoder: Incomplete trailing escape (%) pattern". Мы поняли, что вообще не должны кодировать и декодировать % как значение, чтобы столкнуться с этой проблемой.

person ravindra nath    schedule 24.09.2015
comment
Точно проблема у меня была. Я переключился с URL-адреса, такого как /getsomething/{text}, на /getsomething?text=, поэтому декодирование осталось без дела. - person MikeKulls; 14.10.2020

Чтобы получить параметр, я написал

String requestURL=request.getQueryString(); 

так что Он даст нам параметры. Из этого мы можем использовать String.substring() для получения предпочтительного параметра в случае фиксированной длины или одного параметра. потом

String decodeValue = URLDecoder.decode(value,"UTF-8"); 

также получит предпочтительную строковую кодировку знака %.

person Dipendra Shrestha    schedule 20.06.2013

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

public class TestPercentage {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String transResult = "Se si utilizza DHCP%2C i valori validi sono S%C3%AC o No.%24%23%24%23%24%23%25NICyUSEWINS%25%24%23%24%23%24%23Se si utilizza WINS%2C i valori validi sono S%C3%AC o No.%24%23%24%23%24%23%25NODEFULL%25%24%23%24%23%24%23Nome completo del computer%24%23%24%23%24%23%25NODENAME%25%24%23%24%23%24%23I primi 8 caratteri del nome effettivo del computer%24%23%24%23%24%23%25NWCONTEXT%25%24%23%24%23%24%23Nome contesto NetWare%24%23%24%23%24%23%25NWSERVER%25%";
        String decode = null;
        try {
            decode = URLDecoder.decode(transResult, "UTF-8");
        } catch (UnsupportedEncodingException ue) {
            System.out.println("UnsupportedEncodingException ! = " + ue);
        } catch (IllegalArgumentException ile) {
            System.out.println("IllegalArgumentException ! = " + ile);
            if (transResult.endsWith("%")) {
                transResult = transResult.substring(0, transResult.lastIndexOf("%"));
                System.out.println("transResult2 = " + transResult);
                try {
                decode = URLDecoder.decode(transResult, "UTF-8");
                } catch (UnsupportedEncodingException ue2) {
                    System.out.println("UnsupportedEncodingException 2 = " + ue2);
                } catch (IllegalArgumentException ile2) {
                    System.out.println("IllegalArgumentException ! = " + ile2);
                }
            }
        }
        System.out.println("decode = " + decode);
    }

}
person dubet    schedule 22.08.2018