Naver Perl Community & Study Cafe


2010.11.10 19:30

perl URI::Escape 모듈


얼마전 친구의 요청으로 지오코딩 API 를 사용해서
주소의 좌표를 얻어야 하는 코드를 작성할 일이  생겼습니다.

지오코딩 API 의 링크 : http://code.google.com/intl/ko/apis/maps/documentation/geocoding/

저는 모바일 프로그래밍은 관심이 별로 없는데 들리는 이야기로는
대부분 이 API 를 사용해서 좌표를 얻어 모바일에서 처리한다고 하네요 ^^;

그래서 친구한테 이 API 를 사용하면 쉽게 되겠네~ 해서
코드를 바로 짰습니다.

2바이트의 문자가 url에 그대로 들어가면 브라우저에 따라
인식못하고 글자가 깨지는 현상이 일어나기 때문에
url 을 변환해주는 코드를 작성해야 합니다.

기본적으로 많이 사용하는 Perl 코드는 아래와 같습니다.


Perl URL Encode & Decode String

Here's an excellent way to encode strings that are going to be placed in a URL:

$str =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;

Likely, "page_given_string.php" will want to decode $str back into something useful:

$str =~ s/\%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg;


원문 Link : http://support.internetconnection.net/CODE_LIBRARY/Perl_URL_Encode_and_Decode.shtml

코드상으로 처리해도 상관은 없지만,
Perl 에서는 이것을 쉽게 처리할 수 있도록 모듈을 제공하고 있습니다.



URI::Escape

Escape and unescape unsafe characters
URI-1.56***** (2 Reviews) - 06 Oct 2010 - Gisle Aas





이 모듈을 쓰면 예를들어 "부산 부산진구 부암3동 441-3" 문자열이

%BA%CE%BB%EA%20%BA%CE%BB%EA%C1%F8%B1%B8%20%BA%CE%BE%CF3%B5%BF%20441-3



이런 형식으로 변환되게 됩니다.
그런데 이 주소로 지오코딩 API를 사용하여 쿼리를 날리니 값을 받을 수 없는 겁니다.

이상하다 싶어 실제 API 값을 살펴보니
"부산 부산진구 부암3동 441-3"  주소가 아래와 같이 변환이 되었습니다.

%EB%B6%80%EC%82%B0%20%EB%B6%80%EC%82%B0%EC%A7%84%EA%B5%AC%20%EB%B6%80%EC%95%943%EB%8F%99%20441-3

자세히 살펴보다보니
아.. URL 주소가 UTF-8로 되어 있어서 이것을 인코딩 시키면 되구나..
생각이 들더군요.

URI::Escape 모듈에는 uri_escape_utf8 이라는
함수도 존재하기 때문에 간단히 이 함수를 쓰면
해결이 되겠구나 라고 생각했는데...

%C2%BA%C3%8E%C2%BB%C3%AA%20%C2%BA%C3%8E%C2%BB%C3%AA%C3%81%C3%B8%C2%B1%C2%B8%20%C2%BA%C3%8E%C2%BE%C3%8F3%C2%B5%C2%BF%20441-3

두둥;; 전혀 다른값이 나오는 겁니다..
고민고민을 하다가 Perl 커뮤니티에 들어가서 물어보니
인코딩이 utf-8인 터미널에서 잘 돌아간다는 것을 알게 되었습니다. ㅠ_ㅠ

즉 펄내부유니코드 포멧을 utf8인코딩 바이트시퀀스로 바꾸어서
 uri_escape 를 사용해야 한다는 정리!

이 단순한 문제때문에 야후 거기 API 로 바꿀 생각까지 했습니다 ㅎㅎ;

혹시나 지오코딩 API 를 사용할때
문제를 격을지도 모를 분들을 위해 코드 정리!!  :-)


1
2
3
4
5
6
7
8
9
10
use strict;
use Encode qw/encode decode/;
use URI::Escape;
use LWP::Simple;
sub _e{ decode('cp-949',shift)  };
sub _e1{ encode('cp-949',shift); }
my $address = uri_escape_utf8( _e("부산 부산진구 부암3동 441-3"));
my $url = "http://maps.google.com/maps/geo?output=xml&q=$address";
my $location = _e1(get($url));
print $location;

원본 Link : http://codepad.org/ePUDSmgm


도움을 주신 a3r0님과 am0c 님 감사합니다
JEEN님은 별로.. ㅋㅋㅋ
신고
Trackback 2 Comment 3