자바에서는 URLEncoder를 사용해서 인코딩을 할 수 있는데 자바스크립트에서 사용하는 encodeURIComponent와 살짝 다르다.
Java의 URLEncoder:
- literal characters (regex representation):
[-a-zA-Z0-9._*]
- the space character
" "
is converted into a plus sign"+"
.
JavaScript의 encodeURIComponent():
- literal characters (regex representation):
[-a-zA-Z0-9._*~'()!]
즉, 자바에서는 빈칸을 ‘+
‘로 바꾸고 자바스크립트는 빈칸을 ‘%20
‘으로 변환,
그리고 자바스크립트에서는 ‘~'()!
‘을 그대로 두지만 자바에서는 각각 UTF-8 인코딩시킨다.
결국 빈칸과 ~'()!을 변환시키면 URLEncoder의 결과를 encodeURIComponent의 결과와 동일하게 만들 수 있다.
public static String encodeURIComponent(String s) { String result = null; try { result = URLEncoder.encode(s, "UTF-8") .replaceAll("\\+", "%20") .replaceAll("\\%21", "!") .replaceAll("\\%27", "'") .replaceAll("\\%28", "(") .replaceAll("\\%29", ")") .replaceAll("\\%7E", "~"); } // This exception should never occur. catch (UnsupportedEncodingException e) { result = s; } return result; } |
안드로이드에서 개발한 앱과 서버간의 통신이 제대로 안되어 헤맸었는데 빈칸이 다르게 변환되는 것이 문제였다.
Java equivalent to JavaScript’s encodeURIComponent that produces identical output?