History of Standards concerning URI with Non-ASCII characters
1994ë ì URI를 ì ìíë RFC1630 ëë URLì ì ìíë RFC1738ì ë³´ë©´ ì ì ìë¯ì´, ì´ê¸°ë¶í° URIë Non-ASCII 문ì를 í¬í¨í ì ìë¤. íì¬ ì°ë¦¬ê° Percent Encodingì´ë¼ê³ ë¶ë¥´ë escaping ë°©ìì ë¨ì§ 공백ì´ë ì ì´ ë¬¸ìë¤ ê·¸ë¦¬ê³ 7bit ë²ì를 ëì´ìë unsafe 문ìë¤ì ííí기 ìí´ ì ì ëì´ììì¼ë, ì´ë¤ 문ì ì¸ì½ë©ì ì¬ì©í´ì¼íëì§ë ì ìëì§ ììì¼ë©°, I18Nì ëí´ì ëª ííê² ì¸ê¸íì§ë ììë¤.
1998ë , IETF Policy on Character Sets and Languages (RFC2277)ìì I18Nì ìí´ ëª¨ë íë¡í ì½ìì 모ë 문ì ë°ì´í°ë 문ìì (charset)ì ëª ìí´ì¼íë©°, UTF-8 문ìì§í©ê³¼ ì¸ì½ë©ì ì¬ì©í ì ìì´ì¼ íë¤ê³ ëª ìë¨ì¼ë¡ì¨ ì¸í°ë· íë¡í ì½ë¤ì ëí 기본ì ì¸ I18N ê°ì´ëë¼ì¸ì´ ë§ë¤ì´ì¡ë¤. ê·¸ë¼ìë ë¶êµ¬íê³ , ì´íì ì ë°ì´í¸ë URI를 ì ìíë 1998ë ì RFC2396ì Escaped Encodingì ê´í´ì ì¢ ë ìì¸íê³ ì ë°íê² ì¤ëª íê³ ìì§ë§ ìì Escaped Encodingì ì ì©í ë ì´ë¤ character encodingì ëí ì¸ê¸ì ììë¤. ë¤íí 1999ë ì W3Cìì ì¶íí HTML 4.01ì Appendixììë Non-ASCII 문ì를 UTF-8ë¡ íííëë¡ ‘ê¶ì¥’íê² ëìë¤. 2001ë ì ìì W3C쪽 ë©¤ë² í ì¬ëì´ 19th IUC(International Unicode Conference)ìì Non-ASCII 문ìì ëí UTF-8ê³¼ Percent Encoding ì¬ì©ì ê³µìííë IRI (Internationalized URI)ì ê´í ë°í를 íê³ , ì´ë IRI specification ìì ì¼ë¡ ì´ì´ì¡ë¤. IRIì ê²°ê³¼ê° RFCë¡ ê²°ì¤ì 맺ì ê²ì 2005ë ì RFC3986ì´ìë¤. ì´ ëììì¼ scheme-specificí 문ì ì¸ì½ë©ì ê´í ì¸ê¸ê³¼ í¨ê» ìë¡ì´ schemeì´ UCSë¡ ë í ì¤í¸ë¥¼ ì ìí ëë UTF-8ê³¼ Percent Encodingì ì¬ì©í´ì¼íë¤ë ì¸ê¸ì´ ë¤ì´ê°ê² ëìë¤. (http schemeì Generic URI를 ì¬ì©íë¯ë¡ UTF-8ë¡ ì¸ì½ë©ëì´ì¼í¨ì ì미íë ê²ì¼ë¡ í´ìíë ê²ì´ ì ì í ê²ì´ë¤.)
Web Browser’s Perspective
íí¸, ì¹íì´ì§ë¤ì ìê° ì¦ê°íê³ , Non-ASCII 문ìë¤ì í¬í¨í URIë¤ì´ íêµì í¬í¨í ë¹ìì´ê¶ì ë§ì ì¹íì´ì§ë¤ì ë¤ì´ê°ë©´ì, ë¸ë¼ì°ì ë ì´ë¤ì ì´ë»ê² ì²ë¦¬í´ì¼í ì§ ê³ ë¯¼í´ì¼ë§ íë¤. ì¼ë°ì ì¼ë¡, ì¹ë¸ë¼ì°ì ë ì¬ì©ìê° íì´ì§ ë´ì URIì í´ë¦íì ë, ê·¸ URLì í´ë¹íë íì´ì§ë¥¼ ë³´ì¬ì£¼ê¸° ìí´ì, URIì ëª ìëì´ìë ìë²ë¡ URIì ë³´ë´ì¼íë¤. ë¸ë¼ì°ì ê° ì´ URIë¤ì ì´ë¤ ííë¡ ìë²ë¡ ë³´ë´ëëì ë°ë¼ ì¸ê°ì§ì ë°©ìì¼ë¡ ëë ì ìë¤.
- Non-ASCII 문ìë¤ì ì¹íì´ì§ì ì¸ì½ë©ëë¡ ì¸ì½ë©ë ì± (ê·¸ëë¡ í¬í¨í ì±) URL를 ì¹ìë²ë¡ ë³´ë¸ë¤.
- Non-ASCII 문ìë¤ì ì¹íì´ì§ì ì¸ì½ë©ì ì¬ì©íì¬ Percent Encodingí í ì¹ìë²ë¡ ë³´ë¸ë¤.
- Non-ASCII 문ìë¤ì ì í´ì§ ì¸ì½ë© (e.g. UTF-8) ì ì¬ì©íì¬ Percent Encodingí í ì¹ìë²ë¡ ë³´ë¸ë¤.
1ë²ìì ë°©ìì Non-ASCII 문ìê° URIì ë¤ì´ê°ìë ìëë¤ë íì¤ì ì§ì ì ì¼ë¡ ë°°ì¹ë ë¿ë§ ìëë¼,
- ì¹ìë² ëë CGI ë±ì ì¹ ì´í리ì¼ì´ì ì´ ì¹íì´ì§ì 문ì ì¸ì½ë©ê³¼ ê°ì 문ì ì¸ì½ë©ì ì¬ì©í´ì URI를 ëì½ë©íëë¡ ì¤ì ëì´ ìê±°ë,
- ì°ì°ì°®ê²ë íì¼ìì¤í ë±ììë ê°ì ì¸ì½ë©ì ì¬ì©íê³ ìì´ì¼íë¤ë ì ì½ì´ ìë¤. (ì¦, ëì½ë©ì ìì íì§ ìì)
ì¹ìë²ê° ì¸ì½ë©ì ëí ì§ìì´ ë¹ ì ¸ìë trivialí 구íì¸ ê²½ì° íìì ê²½ì°ê° ë°ìíê² ëë¤. ì´ë¥¼í ë©´ EUC-KR ì¹íì´ì§ìì ëì¨ EUC-KR URI를 ì¹ìë²ìì ê·¸ëë¡ ë겨주ëë¼ë ë¤íí EUC-KR íì¼ ìì¤í ì´ë¼ì ì ëë¡ ì¹íì´ì§ê° ë³´ì¬ì¡ìë¿, íì¼ìì¤í ì ì¸ì½ë©ì UTF-8ë¡ ë³ê²½íë ¤ë©´, ì¹íì´ì§ì ì¸ì½ë©ê¹ì§ ë°ê¿ì¼íë¤.
2ë²ìì ê²½ì°ë 1ë²ìì ê²½ì°ì ë¹ì·íë, 1ë²ìììì íìì ê°ì ê²½ì°ë ë°ìí ì ìë¤. ì ëë¡ êµ¬íë ì¹ìë²ë¼ë©´ URIì í´ìì´ í
¹ì ì¸ì½ë©(Encoding A)ì¼ë¡ ì¤ì ëì´ìê±°ë íì´ì§ì ì¸ì½ë©ì ë°ë¥¸ë¤ê³ íëë¼ë, ìë²ì íì¼ìì¤í
ì´ ì´ë¤ ì¸ì½ë©(Encoding B)ì¸ì§ ì¸ì§í í ì ì íê² ì¸ì½ë©ì ë³í(A->B)í´ì¤ ê²ì´ë¤. íì§ë§, íì¤ì ì¼ë¡ ì¹ìë²ìì ì´ë¬í ëê°ì§ ì¸ì½ë©ì 모ë ëª
ìíë ê²ì ìë¹í ë³µì¡ë를 ì¼ê¸°ìí¨ë¤. ëë¤ë¥¸ 문ì ë, ì´ë° ì¹ìë²ë¡ Non-ASCII 문ì를 í¬í¨í URI를 ìì±í´ì ë³´ë´ì¤ ëë ì¹ìë²ê° ì´ë¤ ì¸ì½ë©ì ì¬ì©íëì§ í´ë¼ì´ì¸í¸ ì¦, ì¹ë¸ë¼ì°ì ë ì¹ì¬ì©ìê° ì¸ì§íê³ ìì´ì¼íë¤ë ê²ì´ë¤. URIê° ì¹íì´ì§ììë§ í´ë¼ì´ì¸í¸ìê² ì£¼ì´ì§ë¤ë©´ ì¹íì´ì§ì ì¸ì½ë©ì ìëì ì¼ë¡ ë°ë¦ì¼ë¡ì ì´ë¬í 문ì 를 í´ê²°í ì ìì¼ë, URIì interoperatibility를 í¬ê² ë¨ì´ë¨ë¦°ë¤. í´ë¼ì´ì¸í¸ê° Non-ASCII 문ìë¡ URI를 ìì±íë ì¼ì´ íë¤ì´ì§ ë¿ë§ ìëë¼, ìë²ì¸¡ì 문ì ì¸ì½ë©ì¼ë¡ ì¸ì½ë©ë URI를 í´ë¼ì´ì¸í¸ 측ìì ëì½ë©í´ì ë³´ì¬ì¤ ìë ìê²ëë¤. (trivialí í´ë¼ì´ì¸í¸ë¼ë©´ ìë²ì¸¡ì ì¸ì½ë©ì 무ìíê³ í´ë¼ì´ì¸í¸ì ì¸ì½ë©ì ì¬ì©í´ì ëì½ë©í¨ì¼ë¡ì¨ ë¶ë¶ì ì¼ë¡ ë³´ì¬ì£¼ë ìë를 í ìë ìì ê²ì´ë¤.)
3ë²ìì ê²½ì°ìë ëëì´ URIë í´ë¼ì´ì¸í¸ì¸¡ì ì¸ì½ë©, ìë²ì¸¡ì ì¸ì½ë©ê³¼ë ë 립ì ì´ê³ , í´ë¼ì´ì¸í¸ì ìë² ëª¨ë ì¶ê°ì ì¸ ì ë³´ìì´ URI를 ì¸ì½ë©íê³ ëì½ë©í ì ìê²ëë¤. ë°ë¼ì, ë¶ê°ì ì¸ ì¤ì ì´ íìíì§ë ìì ë¿ëë¬, URI를 ì¬ì©ììê² ì¹ìí ííë¡ ëì½ë©í´ì ë³´ì¬ì£¼ê¸°ë ì¬ì¸ ê²ì´ë¤. 2ë²ìì ë¹í´ì í¬ê² ì¶ê°ëë ë¹ì©ë ìë¤.
One Character Encoding To Rule Them All
ì¬ê¸°ì íµì¬ì RFC3986ì 2.5ì ìì ì¸ê¸íë¯ì´, URIì ìì±ê³¼ ì ì¡ê³¼ì ììë íë ì´ìì 문ìì¸ì½ë©ì´ ê´ì¬í ì ìë¤ë ê²ì´ë¤. ì´ë¥¼ í´ê²°í기 ìí ê°ì¥ ì§ê´ì ì¸ ë°©ë²ë¤ì ë°ë¡ 문ì ì¸ì½ë©ì ëª ìíê±°ë, íëì íµì¼ë 문ì ì¸ì½ë©ì ì íë ê²ì´ë¤. íì¬ì íì¤ ëª ì¸ì URIì 문ì ì¸ì½ë©ì ëª ìí ì ìë ë©ì»¤ëì¦ì´ ì¡´ì¬íì§ ì기 ë문ì ì¤í ê°ë¥í ê²ì íìì ë°©ìì´ê³ , íëì íµì¼ë 문ì ì¸ì½ë©ì ë°ë¡ UTF-8ì´ ëë ê²ì´ë¤. ê·¸ë¦¬ê³ ê·¸ê²ì´ 3ë²ìì´ ì°ë¦¬ê° ë³´ê³ ìë í´ëµì¸ ì´ì ë¤.
Internet Explorer 7 vs. mod_url
Internet Explorer ìµì
ì ì¸ì¬íê² ë¤ì¬ë¤ë³´ì§ ììëë¼ë, Internet Explorerê° URIë¤ì UTF-8ë¡ ì¸ì½ë©íëë¡ íë ìµì
ì´ ì¡´ì¬íë¤ë ì¬ì¤ì íêµì¸ë¤ìê²ë ì ìë ¤ì ¸ìì ê²ì´ë¤. ìë§ë, ëë¶ë¶ì ì¬ëë¤ì ì´ ìµì
ì êº¼ì¼ íêµì ì¹íì´ì§ë¤ì ì ìì ì¼ë¡ ë¸ë¼ì°ì§í
ì ììë ê²½íì ê°ì§ê³ ìì ê²ì´ë¤. ë¬¼ë¡ , í¹í URIìì Non-ASCII 문ì, ì¦ íê¸ì ì¬ì©íë ê²½ì° ë§ì´ë¤. ì´ì ë ììì ì¤ëª
í 1ë² ë°©ìì´ë 2ë² ë°©ìì í´ë¹íë ì¹ë¸ë¼ì°ì , ì¹ìë²ë¤ì´ ì¹ì ì§ë°°íê³ ìì기 ë문ì´ë¤. ì ì´ë Internet Explorer 5 ë¶í° ì´ ìµì
ì´ ìì§ë§, Non-ASCII 문ì를 í¬í¨íë URIë¤ì ìí´ìë ì´ ìµì
ì ëëë¡ ê¶ì¥íê³ ìë¤.
ë´ ê¸°ìµì¼ë¡ë ì´ ìµì ì´ ì²ì ë±ì¥íì ëë (ìë§ë íê¸íììë§?) 기본ì ì¼ë¡ êº¼ì ¸ììë ê² ê°ë¤. ê·¸ë°ë° ì¸ì ê°ë¶í°ì¸ê° ì´ ìµì ì´ ê¸°ë³¸ì ì¼ë¡ ì¼ì§ë©´ì ë§ì íêµ ì¬ì´í¸ë¤ì 문ì ê° ë°ìíê³ ì´ ë mod_urlì´ ë±ì¥íë¤. mod_urlì UTF-8ë¡ ì¸ì½ë©ëì´ ì¹ìë²ë¡ ë¤ì´ì¤ë URI를 ìíë ì¸ì½ë© (e.g. EUC-KR)ë¡ ë³ííì¬ redirect ìí´ì¼ë¡ì¨ ì¹ ë¸ë¼ì°ì ê° ê°ì ë¡ í¹ì ì¸ì½ë©ì ì¬ì©íëë¡ ë§ëë ì¼ì¢ ì í¸ë¦ì´ìë¤. ì´ë¬í ë°©ìì´ Internet Explorer 6ê¹ì§ë ì ëìíì§ë§, Internet Explorer 7ê° redirectë URIë UTF-8ë¡ ì¸ì½ë©íê² ëë©´ì ì´ í¸ë¦ì ëìíì§ ìê² ëìë¤. ê²°êµ, mod_urlì ì¬ì©í´ 문ì 를 í´ê²°íë ì¹ìë²ë¤ì ë¤ì 문ì ê° ë°ìíê² ëìë¤. (mod_urlì ìì¸í ëì ë°©ìì´ë IE 7ê³¼ ê´ë ¨í 문ì ì ëí´ìë mod_urlê³¼ IE7ì´ë¼ë ê¸ê³¼ ie7 utf-8 bug íê¸ì£¼ì ìì² ë²ê·¸ë¼ë ê¸ì ì°¸ê³ íë¼.) Internet Explorer 7ì ì´ë¬í ë³ê²½ì ‘ë²ê·¸’ë¡ ë¶ë¥´ë ê²ì ì못ë ê²ì´ë¤. Internet Explorer 7ì ì¢ ë íì¤ì í¸íëë ì¡°ì¹ë¥¼ ì·¨íì ë¿ì´ê³ , 기존ì 문ì 를 í¸ë¦ì¼ë¡ í´ê²°í ê³³ë¤ë§ 문ì ê° ë°ìí ê²ì´ë¤.
Internet Explorer 7 vs. Firefox
íì¬ Internet Explorer 7ì 기본ì ì¼ë¡ URI를 UTF-8ë¡ Percent Encodingíë¤. Firefoxë Percent Encodingì íì§ë§, UTF-8ë¡ íë ê²ì´ ìëë¼, ì¤íëë íê²½ì 기본 ì¸ì½ë© (ì를 ë¤ì´, íêµì´ Windowsë¼ë©´ EUC-KR, íëì 리ë ì¤ íê²½ì´ë¼ë©´ UTF-8)ì¼ë¡ Percent Encodingì íë¤. ë°ë©´ì, Percent Encodingì íë ë¶ë¶ììë ë ë¸ë¼ì°ì ë ì°¨ì´ê° ëë¤. Firefoxë URI ì 체를 Percent Encodingíì§ë§, Internet Explorer 7ì ? ì´íì ë¶ë¶ ì¦ query ë¶ë¶ì Percent Encodingíì§ìê³ ê·¸ëë¡ ë³´ë¸ë¤. ê²°êµ, íê¸ì´ queryì í¬í¨ëê³ , ì´ì ëí ì¸ì½ë©ì EUC-KRë¡ ê°ì íê³ ê°ë°í ì¹ì í리ì¼ì´ì ì´ ìë¤ë©´, 리ë ì¤ìì ì¤íë Firefoxììë ì¤ëìí ê±°ë ì기ë¤. ë¬¼ë¡ ë ë¸ë¼ì°ì 모ë ì ì´ì ì ëë¡ ì¸ì½ë© ëì´ìë URLì ê·¸ëë¡ ì²ë¦¬í기 ë문ì, ì´ ë¬¸ì 를 í¼í기 ìí ë°©ë²ì ì ì´ì ë§í¬ë¥¼ Percent Encodingíë ê²ì´ì§ë§, ê·¸ë° ì ëë¡ ì ê²½ì ì´ë¤ë©´ ì ì´ì ì´ë° 문ì ê° ë°ìíì§ë ììì ê²ì´ë¤. ê²°êµ, Internet Explorerì 차기ë²ì , IE8ì´ë IE9 ì¦ììì ì´ ëìë íì¤ í¸íëê² ë³ê²½ëë©´ ê·¸ì ìì¼ ì¬ëë¤ì IE를 ìíë©´ì ì ëë¡ ëì²í ê²ì´ë¤.
Representing URIs as Decoded Form
ì¬ì´í¸ ë´ì íê¸ì í¬í¨í URIë¤ì UTF-8ë¡ ì¸ì½ë©íë ìì ì íê²ëë©´ ì¬ì©ìë¤ì ê²°êµ ì½ê¸° íë URIë¤ë§ ë³´ê² ëë¤. Internet Explorerì ìííìì¤ìë ëì½ë©ë ííì URI를 ë³´ì¬ì£¼ê¸´ íì§ë§, ì무ë 그곳ì ë³´ì§ ìëë¤. ë§ì½ ì¹ ë¸ë¼ì°ì ë¤ì´ ì¬ëë¤ì´ URI를 ê°ì¥ ì주 ì íë 주ìíìì¤ì ëì½ë©ë ííì URI를 ë³´ì¬ì¤ë¤ë©´, ë¸ë¼ì°ì§ ê²½íì ìë¹í í¥ìë ê²ì´ë¤. http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%ADë³´ë¤ë http://ko.wikipedia.org/wiki/ëí민êµì´ ì¢ì§ ììê°. ì´ë¯¸ 구ê¸ê³¼ ê°ì ê²ììì§ììë ê²ì 결과를 ë³´ì¬ì¤ ë ëì½ë©ë ííë¡ ë³´ì¬ì£¼ê³ ìë¤. (ê²ì ê²°ê³¼ anchorì URIë ì¸ì½ë©ë íí)
Closing
ìì§ I18N-awareíì§ ìë ìì¤í
ë¤ì´ ë§ì§ë§ ê°ë°ìë¼ë©´ ì´ì ë¶í°ë¼ë I18Nê³¼ ì¸ì½ë©ì ëí´ì ì ì´í´íê³ ìì´ì¼íë¤. 문ì ì¸ì½ë©ì ê´í ì´í´ê° ë¶ì¡±í ê°ë°ìë¤ì ë무ë ì주 ë³¼ ì ìë¤. ìëë°©ì´ ë¬¸ì ì¸ì½ë©ì ê´í´ 모른ë¤ë©´ ì´ë»ê² URI ì¸ì½ë©ì ëí´ ì¤ëª
ì íê² ëê°. ê·¸ ì¬ëì ê³¼ì° ìì 문ì ë¤ì í¸ë¦ ì´ì¸ì ê²ì¼ë¡ í´ê²°í ì ì
ìê¹. ê°ë°ìì ìì´ì ìì¸ë¡ ì¸ì´ë ë¼ì´ë¸ë¬ë¦¬ì ì¬ì©ë²ì ì¤ìíì§ ìë¤. ì½ê² ë°°ì¸ ì ì기 ë문ì´ë¤. ì¸ì´ë ë¼ì´ë¸ë¬ë¦¬ ì¡°ì°¨ í¼ì ê³µë¶íì§ ëª»íë¤ë©´ ê°ë°ìë¼ë ì§ì
ì ê·¸ë§ëë¼ê³ íê³ ì¶ë¤. ì ì ì¸ê¸íëëë¡ íë¡ê·¸ë머ìê² ê°ì¥ ì¤ìíê³ , êµì¡ ê³¼ì ììë ê°ì¡°ëë©´ìë ì½ê² ì»ì´ì§ì§ë ìê³ , ë ì¸í°ë·°ììë ì무ë ì ê²½ìì°ë ê²ì ë°ë¡ Abstractionì ê´í ê²ë¤ì´ë¤. 기본ì ì¸ ê°ë
ë¤ì ì´í´íì§ ëª»íê³ , ìë¡ì´ ê°ë
ë¤ì ë§ë¤ì´ë¼ ì ìë¤ë©´, ëìíë ê²ì ì ë§ëë ì¸ì¼í°ë¸ë¥¼ ë§ì´ ë°ë ê°ë°ìë ë ì ìì´ë, ë¤ë¥¸ ê°ë°ìë¤ìê² ì¸ì ë°ë íë¥í ê°ë°ìë ë ì ìë¤. ë¬¼ë¡ ì기ë§ì¡±ì´ ì´ëìì ëì¤ëì§ì ê´í ê°ê°ì¸ì ì íì´ê² ì§ë§.
íí¸, URI ì¸ì½ë©ì ê´í ì¬ë¬ê°ì§ 문ì ë¤ì ë³´ë©´ ì¹ ë¸ë¼ì°ì ì ê°ì ì¤ìí ì í리ì¼ì´ì ì ì ëë¡ ëìíë ê²ë ì¤ìíì§ë§, íì¤ì ì¤ìë ì¤ìíë¤ë ê²ì ëë ì ìë¤. ë¹íì¤ì ì¸ íìì íê°ì§ íì©í ëë§ë¤ ì¼ë§ë ë§ì ì¬ëë¤ì´ í¸íì± ë¬¸ì ë문ì 골머리를 ìê³ ë¹ì©ì ëë¹íìê¹. ì ì´ì ëìíë ë²ì ì ë§ë¤ ì ììë¤ë©´ ì무 문ì ê° ìììí ë° ë§ì´ë¤. ì¤ìí ì í리ì¼ì´ì ì¼ ìë¡ íì¤ ì¤ì ì¬ë¶ë ë©´ë°íê² ê´ì°°ëì´ì¼íê³ ì¤ìëì§ ìë ê²ì ë¹íëì´ì¼ ë§ë íë¤.
Firefox의 URI encoding 방식
On Encoding URI with Non-ASCII chracters 글에 오류가 있었습니다. Firefox는 현재 (2.0) URI를 UTF-8로 Percent-encoding하지 않습니다. (이 사실은 윤묵형이 지적해주셨습니다.) Firefox의 about:config 페이지를 보면 URI encoding에 관한 두개의 옵션이 있습니다. network.standard-url.encode-utf8: HTTP 요청으로 전달되는 URI를…