Regular Motion

개발자가 상팔자

Encoding URL (a.k.a Percent Encoding)

개발을 하다가 URL을 왜 Encoding 해야 하는가? 라는 생각이 들자 갑자기 URL을 Encoding 한다는게 의미하는게 정확히 뭔가? 라는 생각이 들었다.

URL을 Encoding해야 되는 이유는 크게 2가지다.

1. RFC3986에 따르면 URL은 ASCII Character-set으로만 구성되어야 하기 때문에 한글을 포함한 대부분의 외국어나 ASCII에 정의되지 않은 특수문자의 경우 URL에 포함될 수 없기 때문에.

2. URL 내에서 의미를 갖고 있는 문자(%, ?, #)나 URL에 올 수 없는 문자 (Space) 혹은 System에서 해석이 될 수 있는 문자(<, >)를 치환하여 야기될 수 있는 문제점을 예방하기 위해.
* URL에서 문제를 야기할 수 있는 문자들은 이 링크에 잘 정리되어 있습니다.

1) 태초에 URL은 ASCII Character-set으로만 구성되도록 설계되었고, 인터넷 초창기에는 이러한 부분이 크게 문제가 되지도 불편하지도 않았을 거다.  2) 허나 시간이 흐르고, 예상과 다르게 인터넷이 빅히트를 치고 URL이 세계적으로 광범위하게 사용됨에 따라, ASCII의 128개 Character-set으로만 URL을 구성하는건 마치 딸기맛 새콤달콤 밖에 만들 수 없는 제약과 비슷하게 느껴졌을 것이다. 또한 세종대왕 포함 각국의 오피니언 리더들은 모국어로 URL을 만들고 싶은 바램이 있었을 것이다.  3) 이러한 시대의 바램에 부응하기 위해 URL은 ASCII의 한계를 벗어나는 노력을 게을리 하지 않았고, 마침내 Percent Encoding이라는 꼼수라면 꼼수요, 규약이라면 규약을 통해 ASCII의 한계를 벗어날 수 있었던 것이다.

URL Encoding은 어떻게 이루어지는가?

URL Encoding stands for encoding certain characters in a URL by replacing them with one or more character triplet(s) that consist of the percent character %” followed by two hexadecimal digits.

위의 문장이 가장 깔끔하게 URL Encoding을 정의한다. URL에서 문제가 될 수 있는 문자를 %와 2개의 16진수로 구성된 triplet(s)들로 치환한다. 몇개의 triplet으로 하나의 문자를 표현하는지는 Encoding Type과 치환하려는 글자의 종류에 따라 다르다.

Examples) URL Encoding이 필요한 경우와 before & after.

  • ASCII에 정의되지 않는 문자가 포함된 경우. (라틴어는 UTF-8 기준 2byte로 표현된다.)
    Ex) François  ->Fran%C3%A7ois
  • ASCII에 정의되지 않는 문자가 포함된 경우. (한글은 UTF-8 기준 3byte로 표현된다.)
    Ex) 왜 -> %EC%99%9C
  • URL에 공백이 포함된 경우. (URL에는 공백이 포함될 수 없기 때문에 %20으로 치환된다)
    Ex) hello world -> hello%20world
  • %는 URL Encoding을 판단하는 문자로 % 이후는 인코딩 타입으로 인식한다. 따라서 %를 그대로 URL로 전달할때는 %25로 치환해야한다.
    Ex) 50%people -> 50%25people
  •  #은 URL에서 Fragment 구분자로 사용되기 때문에 #을 그대로 사용하려면 %23으로 치환해서 사용해야 한다.
    Ex) apple# -> apple%23

위의 설명에 가장 부합하도록 URL(URI)을 Encoding 해주는 Library는 commons-httpclient에 포함되어 있는 URIUtil ClassencodeQuery(String) 함수가 가장 원하는 결과를 반환하는 것 같다.

* References (More examples and practice)
http://www.ietf.org/rfc/rfc3986.txt
http://www.url-encode-decode.com/
http://bluestarblogkr.blogspot.kr/2011/10/url-encoding.html

3 Comments

  1. 웹 서버의 설정이라고 한 것은 특별한 것이 전혀 없습니다. 그냥 그 써버에 파일을 올려 놓을 수 있는 일반 사용자가 파일 이름에 모두 UTF-8을 쓰면 그 웹 써버의 파일 시스템에서 (그 사용자가 제공하는 웹 공간 안에서는) 사용하는 인코딩은 UTF-8이 되는것입니다. 즉, XP 배우기님이 사용하는 웹 서버는 XP 배우기님이 사용하는 공간 안에서는 파일 시스템 인코딩으로 UTF-8을 쓰고 있는 셈입니다. 위에서 정리한 내용에서 빠진 중요한 부분은 주소창에 써 놓은 ASCII 범위 밖의 글자를 처리하는 방식이 현재 OS의 기본 문자 인코딩에 따라 달라진다는 점입니다. encode-utf8 pref.이 false인 기본 상태에서 현재 기본 문자 인코딩이 EUC-KR이면 입력한 주소를 EUC-KR로 먼저 변환한 후 %HH로 바꿔서 보내고 Windows-1252이면 Windows-1252로 바꾼 후에 %%H로 인코드해서 보냅니다. UTF-8이면 UTF-8로 바꾼 후에 %HH로 인코드해서 보내고요. Linux는 요새 모두 UTF-8을 기본 문자 인코딩으로 사용하므로(일부러 사용자가 바꾸지 않는 한) pref. 값에 영향을 받지 않습니다. 하지만, Windows에서는 ‘기본 문자 인코딩’ (이것의 의미가 사실 Win2k/XP에서는 별로 없지만)이 UTF-8이 아니므로 위의 pref. 값에 영향을 받습니다.

  2. 텍스트 뷰의 폰트, 컬러, 정렬은 변경이 가능하지만 개별 텍스트에 대한 적용은 불가능하며 전체 텍스트에 적용된다. 기본 값은 가독성이 가장 좋은 시스템 폰트에 검정 색이며, 기본 텍스트 정렬은 왼쪽 정렬이다. 텍스트에 다양한 폰트나 컬러 등을 적용하려면 웹 뷰를 사용하여 HTML로 스타일을 줄 수 있다.

답글 남기기

© 2017 Regular Motion

Theme by Anders NorenUp ↑