ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • URLDecoder: Illegal hex characters in escape (%) pattern
    JAVA오류 2025. 1. 20. 15:00
    반응형

    문제 설명: URLDecoder: Illegal hex characters in escape (%) pattern

    에러 메시지 URLDecoder: Illegal hex characters in escape (%) pattern는 URL 디코딩 과정에서 % 뒤에 오는 문자열이 유효한 16진수로 변환되지 않았을 때 발생합니다. 이 문제는 주로 URL을 디코딩할 때 발생하며, % 기호가 올바르게 이스케이프된 값이 아닐 경우에 발생합니다.

     

     

    원인

    URL에서 % 기호는 URL 인코딩에서 특수 문자를 나타내기 위해 사용됩니다. 예를 들어, 공백은 %20으로 인코딩되고, +는 %2B로 변환됩니다. 그러나 URL 디코딩 시 % 뒤에 오는 문자열이 16진수가 아니면 Illegal hex characters 에러가 발생하게 됩니다.

    예를 들어:

    • GET 방식으로 보내는 URL 파라미터에서 공백을 포함할 수 있는데, 이를 URL 인코딩하면 공백이 %20으로 변환됩니다.
    • 하지만 URL 디코딩 과정에서 % 뒤에 올 값이 16진수로 변환될 수 없는 값일 경우 오류가 발생합니다.

     

    해결 방법: %를 %25로 교체

    에러를 해결하려면, % 기호를 %25로 교체하여 URL을 올바르게 디코딩할 수 있도록 해야 합니다. 이 방법을 적용하면 %가 올바르게 인식될 수 있습니다.

     

     

    해결 방법 구현 코드

    1. 문제의 코드
    String s_title = new String(URLDecoder.decode(request.getParameter("title"), "UTF-8"));

    이 코드에서 URLDecoder.decode() 함수는 URL을 디코딩하는데, 만약 URL 내에 % 뒤에 16진수가 아닌 값이 있으면 오류가 발생합니다.

    1. 문제 해결

    URLDecoder.decode() 메서드를 호출하기 전에 % 기호를 %25로 바꾸는 방법을 사용합니다. 이를 통해 %를 이스케이프할 수 있습니다. 예를 들어, 아래와 같이 코드를 수정할 수 있습니다.

    // request.getParameter("title")로 받은 값에서 %를 %25로 바꿔줍니다.
    String tmp = request.getParameter("title").replace("%", "%25");
    
    // URLDecoder.decode()로 디코딩한 후 필요시 다시 %25를 %로 바꿔줍니다.
    String s_title = new String(URLDecoder.decode(tmp, "UTF-8"));
    s_title = s_title.replace("%25", "%");  // %25로 이스케이프된 %를 원래대로 되돌려놓습니다.

    왜 %25를 사용해야 할까?

    %25는 URL 인코딩에서 % 기호 자체를 표현하는 이스케이프 문자열입니다. URL에서 % 기호는 특별한 의미를 가지므로, % 자체를 전달하려면 %25로 인코딩해야 합니다. 예를 들어, title=%25hello는 %hello라는 값을 전달하고, 이를 디코딩하면 %hello라는 문자열이 반환됩니다.

    URL 인코딩과 디코딩 과정

    URL에서 특수 문자나 공백은 인코딩을 통해 안전하게 전달됩니다. 예를 들어, GET 방식으로 파라미터를 보낼 때 공백을 포함한 값이 있을 경우, 그 값은 URL에 포함될 수 없습니다. 대신, 공백은 %20으로 인코딩됩니다.

    • 예시 1: ?title=hello world → ?title=hello%20world
    • 예시 2: ?name=John Doe → ?name=John%20Doe

    이처럼 URL 인코딩은 파라미터 값에서 공백, 특수 문자 등을 변환하여 URL 내에서 사용할 수 있게 만들어 줍니다.

    Escape 문자 표

    URL에서 사용되는 Escape 문자열은 각 특수 문자를 대체합니다. 다음은 몇 가지 Escape 문자입니다:

     

    문자 Escape문자
    공백 %20
    + %2B
    / %2F
    = %3D
    % %25
    & %26
    ? %3F
    # %23
    : %3A

    결론

    URLDecoder: Illegal hex characters in escape (%) pattern 에러는 URL 디코딩 시 % 뒤에 16진수가 아닌 값이 있을 때 발생합니다. 이를 해결하기 위해 % 기호를 %25로 바꾸어 디코딩을 수행하고, 디코딩 후에는 다시 %25를 %로 바꿔주는 방법을 사용할 수 있습니다.

    참고할 예시 코드

    // 1. 파라미터 값에서 %를 %25로 변경
    String tmp = request.getParameter("title").replace("%", "%25");
    
    // 2. 디코딩 수행
    String s_title = new String(URLDecoder.decode(tmp, "UTF-8"));
    
    // 3. 디코딩 후 다시 %25를 %로 변경
    s_title = s_title.replace("%25", "%");
    
    // 결과 출력
    System.out.println(s_title);
    반응형

    댓글

Designed by Tistory.