ASP(EUC-KR) 환경에서 Parameter가 '한글'일 경우 Android에서 깨져서 전달되는 현상

slight-snow·2023년 10월 30일
0

ASP

목록 보기
1/1

// EXAMPLE OF `place`
{
  "navSeq": "0",
  "rpFlag": 16,
  "poiName": "푸른길분수공원",
  "poiId": "---",
  "streetNum": "광주 동구 산수동 358-21",
  "roadName": "광주 동구",
  "centerX": "---",
  "centerY": "---",
  "navX": "---",
  "navY": "---"
}

// XML Code
<a href="https://www.tmap.co.kr/tmap2/mobile/route.jsp?name=${place["poiName"].replace(/\s/g, "")}&lon=${place["navX"]}&lat=${place["navY"]}" class="list-place-navigation">길찾기</a>

ASP(EUC-KR) 코드상에서 위와 같이 <a> 태그의 href 속성이 작성되어 있을때,
웹이나 iOS에서는 poiName'푸른길분수공원'이 정상적으로 파라미터로 전달되지만
Android에서는 '%ED%91%B8%EB%A5%B8%EA%B8%B8%EB%B6%84%EC%88%98%EA%B3%B5%EC%9B%90'와 같은 형태로
인코딩되어 정상적으로 장소명이 전달되지 않는 것을 확인할 수 있었다.

비정상적으로 작동될 것이라면, iOS와 Android 둘 다 이러한 문제가 발생했다면
초기에 버그를 발견했을텐데 내 기종이 iOS라 당연히 정상적으로 작동하는 줄 알았다.

ASP, iOS, Android에 대한 이해가 아직 미숙하다보니
구체적으로 어떠한 작동원리 때문에 동일한 파라미터를
iOS와 Android가 각기 다르게 전달받았는지 아직도 잘 모르겠다.


■ 현재상황
기대: [ 출발지 : 현재위치 ], [ 도착지 : 푸른길분수공원 ]
현실: [ 출발지 : 현재위치 ], [ 도착지 : ????????? ]


즉, 원래는 위와 같은 형태로 TMAP의 어플리케이션의 길찾기 기능이 실행되어야 하는데,
도착지를 제대로 전달받지 못했다는 것이다.

약 1시간의 구글링 결과 몇 가지의 해결방법을 시도할 수 있었다.
일단 전제는 한글은 UTF-8로 인코딩해야 제대로 파라미터로 전달될 수 있다는 것이다.
그렇다면 위의 파라미터를 어떻게 EUC-KR 환경에서 UTF-8로 인코딩을 하냐는 것인데...

1. escape()

escape() 메서드는 ASP에서 알파벳과 숫자 및 * , @, - , _ , + , . , / 를 제외한 문자를 모두 16진수 문자로 바꿔주는 메서드로, 쉼표와 세미콜론 같은 문자가 쿠키문자열과의 충돌을 피하기 위해 사용된다고 한다.

ASP 서버 통신에서도 한글을 전달할 때 escape() 메서드를 사용하였기에,
한글깨짐 현상에 대한 일종의 만능 대처법으로 생각하여 이번에도 escape()를 사용하고,
다시 디코딩을 하기 위해 unescape() 메서드도 함께 사용하였으나
Android 환경에서는 여전히 제대로 전달되지 않는 것을 확인했다.

2. URLEncoder.encode()

16진수가 아닌 UTF-8로 인코딩을 하기 위해 찾은 URLEndocer.encode() 메서드를 사용하여

// XML Code
<a href="https://www.tmap.co.kr/tmap2/mobile/route.jsp?name=${URLEncoder.encode(place["poiName"].replace(/\s/g, ""), "UTF-8")}&lon=${place["navX"]}&lat=${place["navY"]}" class="list-place-navigation">길찾기</a>

위와 같이 코드를 작성해주었으나,
콘솔창에서 URLEncoder is not defined라는 에러 문구를 발견할 수 있었고
이에 구글링을 하여 encodeURI()라는 대안을 발견할 수 있었다.

3. encodeURI()

encodeURI() 메서드는 URI의 특정한 문자를 UTF-8로 인코딩해 하나, 둘, 셋, 혹은 네 개의 연속된 이스케이프 문자로 나타낸다.
encodeURI() 메서드를 사용하여 한글이 포함된 파라미터를 인코딩하여 전달해줬더니
TMAP 어플리케이션에서도 장소명을 전달받아 정상적으로 한글 장소명을 표기함을 확인할 수 있었다!

▶ encodeURI MDN 공식문서


HTML, VanillaJS와 React로 최근에 이런저런 작업들을 하고 있다가
갑작스레 ASP 작업이 들어와서 적잖이 당황스러운 경험이었던 것 같다.

인코딩도 기본적으로 UTF-8로 작업을 해왔었기에,
EUC-KR이라는 새로운 인코딩으로 작업하는 것도 처음이었다.

지금 작성하는 ASP 이슈 말고도 여러가지 버그와 디버깅 과정이 있었고
생각보다 낯설고 험난했다고 생각한다.

하지만 그럼에도 이번 작업에서도 경험한 것은
코딩에 불가능은 없다는 것이다.

여러 경험이 쌓여가면 쌓여갈수록, 불가능해 보이는 것은
내가 아직 해결해보지 못해서이지, 불가능하다고 섣불리 단정지어서는
안된다는 것을 느끼게 되는 것 같다.

profile
주니어 개발자의 기억을 위한 기록 :)

0개의 댓글