-
URLDecoder: Illegal hex characters in escape (%) patternJAVA오류 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을 올바르게 디코딩할 수 있도록 해야 합니다. 이 방법을 적용하면 %가 올바르게 인식될 수 있습니다.
해결 방법 구현 코드
- 문제의 코드
String s_title = new String(URLDecoder.decode(request.getParameter("title"), "UTF-8"));
이 코드에서 URLDecoder.decode() 함수는 URL을 디코딩하는데, 만약 URL 내에 % 뒤에 16진수가 아닌 값이 있으면 오류가 발생합니다.
- 문제 해결
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);
반응형'JAVA오류' 카테고리의 다른 글
Web app root system property already set to different value: (0) 2024.08.23 .yml 파일 commit reject 되는 경우 (0) 2024.05.18 [오류]ApplicationTests > contextLoads() FAILED (0) 2024.05.12 [IntelliJ] - SpringJUnit4ClassRunner import 안되는 경우 (0) 2023.09.15 [Error] - Mapped Statements collection does not contain value for~ (0) 2023.05.12