Technical Notes / www.novonetworks.com Classification: Unicode Unicode 의이해 Understanding of Unicode Release 1.0 2010/6/30
Copyright 2010 novo networks. All rights reserved. All information contained herein is the property of novo networks. No part of this publication (whether in hardcopy or electronic form) may be reproduced or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of novo networks. No responsibility is assumed by novo networks for the use thereof nor for the rights of third parties which may be effected in any way by the use thereof. Any representation(s) in this document concerning performance of novo networks product(s) are for informational purposes only and are not warranties of future performance All other trademarks, service marks, registered trademarks, or registered service marks may be the property of their respective owners. All specifications are subject to change without prior notice. 2
목차 (Table of Contents) 1. AUDIENCE... 4 2. 일반용어... 5 CHARACTER SET (CHARSET, 문자셋 )... 5 CHARACTER ENCODING (ENCODING, 인코딩 )... 6 3. UNICODE 개요... 7 UNICODE 이전의문자셋... 7 UNICODE를만든이유... 8 UNICODE의시작... 8 4. UNICODE 구조... 10 UNICODE의기본개념... 10 UNICODE 코드체계... 15 5. UNICODE 인코딩... 17 UTF-32... 18 UTF-16... 19 UTF-8... 21 6. 마치며... 23 APPENDIX A. 문서정보... 24 A.1 문서이력... 24 APPENDIX B. REFERENCES... 25 3
1. Audience Unicode 는전세계의문자를컴퓨터에서일관되게표현하고다룰수있게설계된 표준입니다. 이표준은세상에나온지거의 20 년이다되어가고, 지금처럼널리사 용된지도 10 년이넘었습니다. 그럼에도불구하고개발자들사이에서는여전히 Unicode 에대해잘모르는경우가 많습니다. Unicode 는문자표현을위한표준으로서특히다국어를지원하는애플리 케이션을작성할때우선고려대상이되어야합니다. 그러기위해서는 Unicode 에대한기본적인이해가선행되어야하며, 본문서는이러 한 Unicode 에대한개략적인이해를돕는데목적을두고있습니다. 내용이표준규격에대한것이다보니자칫용어가딱딱해지기쉽습니다. 이를피하 기위해정식명칭대신에일반적으로많이쓰이는용어로줄여서쓰기도할것입니 다. 가끔 100% 정확한단어나용어가아니더라도미리양해를구합니다. 4
2. 일반용어 Character Set (charset, 문자셋 ) Character Set 이란말그대로문자의집합, 문자테이블입니다. 보통문자셋혹은 캐릭터셋이라고불려집니다. C 언어를배울때자연스럽게접하게되는 ASCII 는영어알파벳, 숫자, 제어문자 등 128 개의문자를모아놓은문자셋입니다. 아래와같이생겼습니다. 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 9 A B C D E F " ', \ ASCII에는한글이없죠? 당연히한글을표현하기위한문자셋도만들어져있는데, KS C 5601 1 이라는것입니다. 이문자셋에는완성형한글 (2350 자 ), 한자, 숫자, 로마 / 그리스 / 일본 / 러시아문자, 괘선문자등이망라되어있습니다. 일부만발췌해보면아래와같습니다. 0 1 2 3 4 5 6 7 8 9 A B C D E F 가각간갇갈갉갊감값갑갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅 일본도히라가나, 가타카나등을표현할수있어야하므로자신들의문자셋을정 의하고있고, 중국도마찬가지로자신들의문자셋을가지고있습니다. 이렇듯컴퓨터에서문자를표현하기위해서는어딘가에문자셋이정의되어있어 야합니다. 1 KSC 5601 이라고공백없이쓰기도하는데요, KS 와 C 사이에공백을두는것이맞습니다. 5
Character Encoding (encoding, 인코딩 ) Character Encoding 은줄여서그냥인코딩이라고많이얘기합니다. 인코딩이란 " 문자를어떤형태의바이트로변환시킬것인가 " 하는것입니다. 앞서보았던 ASCII 테이블을다시보겠습니다. 빨간사각형을따라가보면 'A' 문자는 16 진수값으로 0x41 입니다. 즉, 컴퓨터에서 0x41 로적으면 'A' 문자로알아듣겠다는것입니다. KS C 5601 의경우는 ASCII 보다는좀더복잡합니다. 0 1 2 3 4 5 6 7 8 9 A B C D E F 가각간갇갈갉갊감값갑갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅 위의테이블을읽는방법을 ' 걍 ' 문자로설명드리자면, 먼저표의좌측상단값을취합니다. 테이블구분값입니다. (0xB0) 두번째로 ' 걍 ' 문자의가로 / 세로값을더합니다. (0xC0 + 0x01 = 0xC1) 그런후두값을순서대로나열합니다. (0xB0C1) 이런절차로 ' 걍 ' 문자는 16 진수로 0xB0C1 입니다. ASCII 의경우와마찬가지로컴퓨터에서 0xB0C1 이라고적으면 ' 걍 ' 문자로알아 듣습니다. ( 당연히한국에서만알아듣습니다 ) 6
3. Unicode 개요 Unicode 이전의문자셋 Unicode 가나오기전에는각나라마다문자셋이서로달랐습니다. 예를들어독일어에있는움라우트 (Ä/ä, Ö/ö, Ü/ü) 는 ASCII 에는없는문자입니다. 그래서 7비트짜리였던 ASCII 의상위한비트를더쓰기로했습니다. 그리고는 0~127 까지의하위 128 개는 ASCII 의것을그대로따르고, 상위 128 개공간에움라우트를추가했습니다. 물론움라우트외에도넣을것이많았을겁니다. 이런기본아이디어를그림으로표현하면아래과같습니다. 상위 128 개공간을언어권역별로자신들만의문자들로정의한것입니다. Western Europe Eastern Europe Baltic Greek ASCII Cyrillic Thai, Turkish, Arabic, Hebrew, etc 그러다보니상위 128 개문자들은서로충돌이나기때문에독일에서작성된문서를이스라엘에서열어보면알파벳이긴한데뭔가이상한문자들이보이게됩니다. 예를들어독일에서 résumés( 이력서 ) 를이스라엘로보내면이스라엘에서는 rιsumιs 라고보일것입니다. 7
Unicode 를만든이유 상황이이렇다보니한문서내에서나, 한시스템내에서여러언어를섞어쓰기가쉽지않았고, 언어권이다른두지역간에문서를주고받을수가없었습니다. 학술적으로도도서관과같이모든언어권의데이터가전산화되어야하는곳에서도필요성을많이느끼고있었을것입니다. 하지만누구보다강력히필요성을느낀곳은바로미국의소프트웨어회사들이었을것입니다. 지역별로달라지는인코딩변환을관리한다는것은매우비용이많이드는작업일뿐만아니라, 중국, 일본, 한국과같이문자체계가라틴문자계열과는완전히다른동양권시장을공략하기에도이인코딩문제는큰장벽이되었기때문입니다. 그래서전세계의모든문자를표현할수있는단하나의문자셋인 Unicode 를 만들게되었습니다. Unicode 의시작 통일된표준문자셋을만들기위한노력은 ISO( 국제표준기구 ) 에의해먼저진행 되었는데 ISO 10646 이란국제표준이그것입니다. 이국제표준은 4 바이트체계 로서모든문자에 4 바이트를할당하여사용하자는것이었습니다. 한편 4 바이트체계에대한불만, 진행절차에대한불만, 그리고자신들의 OS 에다국어지원에대한부분을강화하기위해 Apple, Xerox, Sun, Microsoft, NeXT 등이연합하여 1989 년 Unicode 컨소시엄을조직했습니다. 당시 Unicode 컨소시엄에서제안한방식은 2 바이트체계였습니다. Unicode 컨소시엄은 ISO 에게자신들의표준을사용할것을제안하고, 이제안이일부받아들여지면서 1993 년 ISO 10646-1 이라는국제표준이발표되었습니다. ISO 10646 표준의정식이름은 Universal (Multiple-Octet Coded) Character Set 입니다. 줄여서 UCS 라고합니다. 8
ISO 와 Unicode 컨소시엄은각자목적이약간다르기때문에나름대로자신들의표준을발전시켜나가고있습니다. 결국 Universal 문자셋에관한표준은이세상에 2가지가있는것입니다. 그러나다행히도두단체는지속적인협력작업을통해문자셋에들어가는문자 ( 종류, 코드포인트등 ) 에대해서는서로일치시켜나가고있습니다. 2010 년기준으로최신버전의표준은 2009 년에발표된것으로서, Unicode 컨소시엄은 Unicode 5.2 ISO 는 ISO/IEC 10646:2003 plus Amendments 1, 2, 3, 4, 5 and 6 입니다. 9
4. Unicode 구조 Unicode 의기본개념 간단히말하자면 Unicode 는전세계의문자에특정번호를매겨서테이블로만 들어두겠다는것입니다. 새로운문자가추가된다면그저새로운번호를매겨주 면됩니다. 이번호를코드포인트 (Code Point) 라고부릅니다. 코드포인트표기는 U+0041 과같이합니다. U+ 는 Unicode 를의미하고, 0041 은코드포인트값으로서 16 진수로적습니다. U+0041 은영어알파벳 'A' 를의미하고, U+AC00 은한글 ' 가 ' 를의미합니다. 코드포인트는그저단순히일련번호는아닙니다. 문자종류별로영역이있어서라틴문자범위, 한자범위, 한글범위등여러블럭으로쪼개져있습니다. 코드포인트영역에대한좀더자세한설명은잠시후살펴보도록하고, 지금은 Unicode 에서정의하고있는문자셋의실례를확인해보겠습니다. 참고로다음에나오는문자셋들은아래그림과같이세로기준으로나열되어있 습니다. 예를들어 0000 은 NUL, 0030 은 '0', 0041 은 'A' 입니다. 10
먼저 U+0000-U+00FF 영역입니다. 이영역은 ISO 8859-1 문자셋과일치합니다. ISO 8859-1 은 ASCII 확장문자셋으로서서유럽에서많이사용하는알파벳을상 위 128 개영역에추가로배치한것입니다. 11
다음으로한글은 U+AC00-U+D7AF 영역에정의되어있습니다. 영역이너무크기때문에일부만발췌해보면아래와같습니다. 12
이런식으로전세계의많은문자들이할당되어있습니다. Unicode 전체목록을일부나열해보면아래와같습니다. 당연히이영역들을다알필요는없습니다. 단지 Unicode에이렇게많은문자들이할당되어있다는사실을알려드리고자함입니다. 그리고테이블크기는 0x10FFFF 2 로서약 100 만개글자를담을수있는공간이란점을알면더좋습니다. ( 이테이블에실제로할당된문자는약 10 만개입니다 ) 그리고목록을자세히보면후반부에비어있는영역들이있는데이는실제로문 자가할당되지않은빈공간입니다. 앞으로새로운문자들이이곳에할당될것 입니다. 처음 끝 문자종류 0000 007F 제어문자와라틴기본 0080 00FF 제어문자와라틴보충 0100 017F 라틴확장-A 0180 024F 라틴확장-B 0250 02AF 국제음성기호확장 02B0 02FF 조정문자 0300 036F 조합분음기호 ( 악센트 ) 0370 03FF 그리스어와콥트어 0400 04FF 키릴자모 0500 052F 키릴자모보충 0530 058F 아르메니아어 0590 05FF 히브리어중략 3040 309F 히라가나 30A0 30FF 가타카나 3100 312F 주음부호 3130 318F 호환용한글자모중략 4E00 9FBF 한중일통합한자 2 Unicode 는 2 바이트체계인것같은데 0x10FFFF 라니요? 이상하죠? 이에대한내용은다음절 (Unicode 코드체계 ) 에서설명하도록하겠습니다. 13
A000 A48F 이 (Yi) 글자마디 A490 A4CF 이 (Yi) 부수 A700 A71F 어조조정문자 A720 A7FF 라틴확장 -D A800 A82F 실헤티나가리 A840 A87F 파스파문자 AC00 D7AF 한글글자마디 D800 DC00 DBFF DFFF 상위대체영역 (High Surrogate) 문자할당안되어있음 하위대체영역 (Low Surrogate) 문자할당안되어있음 중략 FF00 FFEF 전각 / 반각모양 FFF0 FFFF 특수제어문자 10000 1007F 선상 B 음절문자 10080 100FF 선상 B 상형문자 10100 1013F 에게 (Aegean) 숫자 10140 1018F 옛그리스숫자 10300 1032F 옛이탈리아문자 중략 1D100 1D1FF 악보용기호 1D200 1D24F 고대그리스시대의악보용기호 1D300 1D35F 태현경기호 1D400 1D7FF 수학식에서쓰이는알파벳 20000 2A6DF 한중일통합한자확장 -B 2F800 2FA1F 한중일호환용한자보충 E0000 E007F 태그 E0100 E01EF 모양구별문자보충 F0000 FFFFF 사용자영역보충 -A 100000 10FFFF 사용자영역보충 -B [ 표 1] Unicode 범위목록 3 3 출처 : http://ko.wikipedia.org/wiki/ 유니코드 _ 범위 _ 목록 14
Unicode 코드체계 Unicode 는 2 바이트체계로시작되었고, UCS 는 4 바이트체계로시작되었습니다. 하지만두체계가완전히다른것이아니라 Unicode 가 UCS 의서브셋입니다. 따라서 UCS 의구조에대해알게되면 Unicode 도알수있습니다. UCS 코드체계에서는모든문자가어떤가상의테이블안에할당됩니다. 이테이블은 20 억개의문자가수용될수있는큰테이블로서구조는아래그림 과같습니다. 128 Groups Group 00 256 rows 256 x 256 cells 256 cols Plane FF 256 Planes Plane 00 몇가지새로운용어가보이는데요그의미는아래와같습니다. 용어 Cell Plane ( 평면, 판 ) Group 의미한개의문자가할당되는공간 256 x 256 (= 65536) 개 Cell 의묶음 Plane 00 부터 Plane FF 까지존재합니다. 256 개 Plane 의묶음 Group 00 부터 Group 7F 까지존재합니다. 테이블은총 128 개의 Group 으로구성되고, Group 마다 256 개의 Plane 이존재하며, 각 Plane 은 65536 개의 cell 로구성됩니다. 따라서 65536 x 256 x 128 하면대략 20 억개라는숫자가나옵니다. 15
그리고이테이블에서최초 65536 개의문자가할당되는영역을특별히 BMP (Basic Multilingual Plane, 기본언어판 ) 라고부릅니다. 앞에서 Unicode 는 UCS 의서브셋이라고했습니다. UCS 는 20 억개의문자가할당될수있는가상의테이블을정의하고있습니다. 이에반해 Unicode 는 Group00 의 Plane 00 ~ Plane 16 까지만사용합니다. 즉 17 x 65536 하면약 100 만개의문자가수용될수있는가상의테이블을사용하는것입니다. 하지만두규격모두실제할당된문자는서로완전히일치합니다. 테이블구조에대해알아봤으므로, 이구조를토대로코드포인트를다시살펴보 겠습니다. 영어알파벳 'A' 는 U+0041 이라했습니다. 0041 의의미는아래와같습니다. 한글 ' 가 ' 는 U+AC00 이라했습니다. AC00 의의미는아래와같습니다. 음표는 U+1D160 입니다. 1D160 의의미는아래와같습니다. Unicode 에서는 Group 00 하나만사용하므로 Group 표기는생략합니다. Plane 이 00 인경우도 Plane 값은생략하고 Cell 값만표기합니다. 코드포인트를표현하기위해서는 Plane 번호 5 비트, Cell 번호 16 비트하여, 21 비트의공간이필요합니다. 많은분들이 Unicode 가 2 바이트 (16 비트 ) 체계라고알고계시지만, 실제 Unicode 의코드체계는 21 비트체계라고할수있습니다. 16
5. Unicode 인코딩 Unicode 인코딩이란 Unicode 문자에매겨진정수숫자 (= 코드포인트 ) 가일련의바 이트로어떻게표현되는가하는것입니다. Unicode 에서는서로다른 3 가지인코딩, UTF-32, UTF-16, UTF-8 을제공합니다. 인코딩된바이트형태는서로다르지만 3 가지인코딩모두 Unicode 문자전부를 표현할수있으므로인코딩간변환을거쳐도데이터손실은발생하지않습니다. 각인코딩에대한상세한설명에들어가기전에샘플을먼저보시죠. UTF-32 는모든문자를코드포인트값을그대로유지하면서 32 비트로만듭니다. UTF-16 은대부분의문자는코드포인트값을그대로유지하면서 16 비트로만들지만, BMP 범위를벗어나는문자는특별한변환을거쳐 32 비트로인코딩합니다. ( 위의그림에서나타나듯이같은 32 비트라도 UTF-16 과 UTF-32 의 32 비트는값이다릅니다 ) UTF-8 은코드포인트의범위에따라 1, 2, 3, 4 바이트로서로달리인코딩됩니다. 17
UTF-32 UTF-32 는가장간단한인코딩방법입니다. 모든코드포인트가그대로 32 비트 1:1 매핑됩니다. 앞에남는 11 개비트는 0 으로채워집니다. 인코딩된값자체가코드포인트이기때문에해당하는 Unicode 문자를찾기도쉽 습니다. 이에반해 UTF-16 이나 UTF-8 에서는인코딩된값에대해특정한변환 과정을거쳐야만문자를알아낼수있는경우가있습니다. 하지만아무래도다른인코딩보다는공간을많이차지하기때문에메모리공간에 큰제약이없는상황이거나고정폭인코딩이특별히필요한경우에유용합니다. 주로 Unix 환경에서문자열을메모리에서다룰때사용되고있습니다. 18
UTF-16 UTF-16 은 BMP 영역에최적화된인코딩방법입니다. BMP 영역인 U+0000-U+FFFF 범위의문자에대해서는 16 비트로 1:1 매핑됩니다. BMP 영역을벗어나는 (U+10000-U+10FFFF) 문자에대해서는특별한변환규칙에 따라 32 비트로인코딩됩니다. ( 변환규칙에대한설명은다음절에서하겠습니다 ) 사실실제로많이사용되는현대문자의 99% 는 BMP 영역에있다고합니다. 따라서 UTF-16 은 UTF-32 보다저장공간이적게들면서도, 인코딩된값에서 Unicode 문자를찾기에도비교적 (!) 수월하므로효율적인인코딩이라할수있습니다. 역사적으로보면처음제안된 Unicode 는 2 바이트체계였기때문에 UTF-16 은원 래 16 비트고정폭의인코딩이었습니다. 세월이흘러많은코드포인트를표현하 려다보니위와같이가변폭의인코딩으로바뀐것입니다. 주로 Java 플랫폼, Microsoft 플랫폼에서문자열을다룰때사용되는인코딩입니다. 19
BMP 영역밖의문자에대한 UTF-16 변환규칙 BMP 영역을벗어나는 U+10000-U+10FFFF 의문자에대한변환규칙을좀더자 세히살펴보면아래그림과같습니다. 위의변환규칙에따라음표 같습니다. 에대해실제로 UTF-16 인코딩을해보면아래와 구분 16 진수 2 진수 코드포인트 1D160 00001 1101 0001 0110 0000 인코딩 ( 상위 16 비트 ) D834 1101 1000 0011 0100 인코딩 ( 하위 16 비트 ) DD60 1101 1101 0110 0000 인코딩결과 (32 비트 ) D834 DD60 참고로 UTF-16 과관련된새로운용어를한가지말씀드리겠습니다. 위의변환규칙은인코딩된 16 비트값이 0xD800~0xDFFF 사이의값이되도록고 안되었습니다. Unicode 코드포인트중 U+D800-U+DFFF 영역을특별히 Surrogate 라부르고, 인코딩된상 / 하위비트를합쳐서 Surrogate Pair 라고부릅니다. 보다시피 0xD800-0xDFFF 는 UTF-16 인코딩의결과값이될수있으므로 Surrogate 영역에는문자가할당되어있지않습니다. 20
UTF-8 인코딩효율성만놓고본다면 UTF-16 이좋기는한데 ASCII 문자마저도 2 바이트 가된다는점이문제였습니다. "ABC" 를 UTF-16 으로인코딩하면 <00 41 00 42 00 43> 이됩니다. 문자열중간에널 (null, 0) 이들어가버리므로문자열관련 C 함수들이정상적으로동작하지않게됩니다. 따라서 UTF-16 인코딩을사용하려면기존의 ASCII 기반의프로그램을모두다시작성해야한다는얘기가되는데, 이는현실적으로거의불가능한것입니다. 특히 UNIX 및 LINUX 는콘솔기반프로그램이대부분이므로그정도가더심합니다. 이문제를피하기위해 UTF-8 이제안되었습니다. 이인코딩은 ASCII 호환성을 주목적으로하기때문에중간에널 (null, 0) 이들어가지않도록고안되었습니다. 먼저 U+0000-U+007F 영역에대해서는 1 바이트로인코딩됩니다. 즉 ASCII 문자셋에해당하는값은 1 바이트가됩니다. 더큰코드포인트에대해서는 2 바이트, 3 바이트혹은 4 바이트로인코딩됩니다. ( 변환규칙에대한설명은다음절에서하겠습니다.) UTF-8 은 HTML 문서나 XML 문서의인코딩에적합합니다. 실제로 2010 년현재, Web 상에서 UTF-8 은실질적인표준인코딩으로자리잡고있습니다. 21
UTF-8 변환규칙 UTF-8 는코드포인트의범위에따라아래와같이다양하게인코딩합니다. UTF-8 인코딩에대해끝내기전에간단한퀴즈입니다. Q : 한글 ' 가 ' 는 UTF-8 로인코딩하면몇바이트가될까요? A : 3 바이트입니다. 이유를아셔야하는데요, 한번생각해보시길바랍니다. 22
6. 마치며 이로써 Unicode 에대한간단한설명을마칩니다. 지금당장 Unicode 프로그래밍을하는개발자입장에서보면본문서의내용이 별로도움이안될지도모르겠습니다. 여기에는 Unicode 프로그래밍에관련된내 용이없기때문입니다. Unicode 프로그래밍은 ASCII 일때와어떤점이다른지, 인코딩변환을위해서는어떤라이브러리가있는지, Database 는어떻게설정을해줘야 Unicode 를정상적으로사용할수있는지, 인코딩이란것을보니오래된것부터새것까지너무많은데이게다뭔지, 등많은질문이있을수있습니다. 하지만이런현실적인질문에대한답을찾아가다보면, 결국은 Unicode 자체에 대한이해가필요한시점이있습니다. 본문서가그런시점에서최소한의가이드 역할을할수있으면좋겠습니다. 고맙습니다. 23
Appendix A. 문서정보 A.1 문서이력 문서목적 Unicode 에대한기본적인이해를돕는다. 작성자 김정환 / john@novonetworks.com 작성이력 최초작성 : 2010-06 24
Appendix B. References Unicode Standard 5.2 (http://www.unicode.org/versions/unicode5.2.0 ) Unicode 매뉴얼입니다. 10MB 짜리 PDF 를다운로드받을수있습니다. Unicode 에관한가장정확한정보는이문서에있습니다. Unicode Charts (http://www.unicode.org/charts/ ) 지역카테고리에따라분류된 Unicode 문자를확인할수있습니다. 코드포인트별로확인하려면 http://rudhar.com/lingtics/uniclnks.htm Unicode Character Search (http://www.fileformat.info/info/unicode/char/search.htm ) 코드포인트로 Unicode 를검색해주는사이트 글자모양, UTF-32, UTF-16, UTF-8 인코딩결과등을한눈에볼수있습니다. WWW의국제화와한국화 (http://www.w3c.or.kr/i18n/www-i18n ) 1996 년 11 월 29 일, 한국과학기술원경영정보연구센터, 정주원 Unicode 의코드체계에대한설명을볼수있습니다. Unicode 뿐만아니라한글관련인코딩도간단히설명하고있습니다. Web 기술에서국제화와관련된부분에집중하여정리되어있습니다. 학술데이터베이스의유니코드변환적용에관한연구 2003 년 12 월, 한국교육학술정보원, 조순영외한국교육학술정보원 (KERIS) 에서제공하는학술연구정보서비스 (RISS) 를 Unicode 체계로전환하기위한연구보고서입니다. Unicode 범위목록 (http://ko.wikipedia.org/wiki/ 유니코드 _ 범위 _ 목록 ) [4. Unicode 의기본개념 ] 에서인용했던 Unicode 범위목록입니다. 조엘온소프트웨어블로그 (http://www.joelonsoftware.com/articles/unicode.html ) Unicode 에대해명쾌하게정리해주고있습니다. Introduction to Unicode (http://www.panl10n.net/presentations/afghanistan/unicode.pdf ) by Atif Gulzar Center for Research in Urdu Language Processing 25