컴퓨터에서텍스트를표현하는방식및문자코드 1. bit 와 byte 컴퓨터속에서모든데이터와명령은 2진수로표상된다. 컴퓨터의저장장치 ( 하드디스크, 플로피디스크, RAM) 에기록 ( 저장 ) 될수있는것은 2진수뿐이며, CPU도 2진수의연산만을사용한다. 0 또는 1( 즉 on or off) 의 1자리 2진수에해당하는정보를저장할수있는단위를 bit(binary digit) 라고한다. 즉 1 bit의저장공간에는 2가지기호밖에저장할수없다. 8 bit의묶음을 1 byte라고한다. 1 byte 에저장될수있는기호의수 = 2 8 = 256 영문자의대문자와소문자, 숫자, 키보드에서직접입력이가능한여러기호들을모두합쳐도 128개를넘지않기때문에이들은 1 byte의저장공간만있으면모두구분할수있다. 미국국가표준기구 (ANSI, American National Standard Institute) 에서는이들대소문자와기호들에모두 code를부여해서표준으로정해놓았다. 이것이곧 ASCII (American Standard Code for Information Interchange) 아스키코드에서 영문자대문자는 65-90 번, 소문자는 97-122 번에배정되어있다. 숫자는 48 번 (0) - 57 번 (9) 여기서 A 가 65 번이라는말의의미는 A 라는문자가컴퓨터에서처리될때에는 1 byte 의저장공간안에다음과같이 2 진수로기록된다는뜻이다. 0 1 0 0 0 0 0 1 이 2 진수는 10 진수로표현하면 65 가되고 16 진수로표현하면 41 이된다. 16 진수를표기할때에는 10 진수와구분하기위해앞에 0x 를붙여준다. 2진수 16진수 10진수 A 0100 0001 0x41 65 B 0100 0010 0x42 66 C 0100 0011 0x43 67
2. 1 byte 문자와 2 byte 문자 그런데한글은 ( 옛한글을제외하고 ) 현재통용되고있는것만따져도수천개나되기때문에 1 byte 로모든한글들을구분해서표현할수없다. 따라서모든한글들을구분해서표현하는데에는 2 byte가소요된다. 2 byte는 16 bit이므로 2 16 = 65536 개의기호가구분될수있다. 예를들어 ' 가 ' 는 1011 0000 1010 0001 즉 0xb0a1 으로표현된다. 1 byte 문자는 byte 의첫 bit(msb, most significant bit) 가 0 이고 2 byte 문자는 MSB 가 1 이다. 미국에서 ASCII code를국가표준으로정해놓고있듯이 ( 사실 ASCII는미국뿐아니라전세계적표준의기반으로받아들여지고있다.) 각국가는자기나라에서사용되는문자들의 code를표준으로정해놓고있다. 한글뿐아니라사용되는글자의가짓수가 128개를넘는나라에서는모두같은문제가제기된다. 이에따라나라마다자기나름의표준을정해놓고있다. 3. 한글문자코드 초기에는한글을 3 byte 로표현하는방안, 가변 byte 방안 ( 하나의자소에 1byte 를배당하는방안 ) 등이제시되기도하였다. 그러나그후에가장큰영향을미친것은조합형과완성형이다. 3.1. 조합형한글코드조합형은 2 byte를이루고있는 16 bit 중맨첫 bit는 1 byte 문자와 2 byte 문자를구분하는기호로삼고 ( 전자는 0, 후자는 1) 나머지 15 bit를초성 5 bit, 중성 5 bit, 종성 5 bit씩배당한다. 5 bit로표현될수있는문자의가짓수는 2 5 =32 가지인데현대한글에서초성은 19개, 중성은 21개, 종성은 28개이므로모두 5 bit로표현될수있는것이다. 조합형은 code만보면초성이뭐고중성이뭐고종성이뭔지를알수있는장점이있다.
WORD/2-Byte High-Byte Low-Byte 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 초성 5-Bit 중성 5-Bit 종성 5-Bit MSB: Most Sigficant Bit Hangul Bit Flag MBCS : Multi-Byte Character System 2-Byte : 한글, 한자, 전각영문, 전각기호등 1-Byte : ANSI ASCII Character ( 반각영문, 숫자등 ) 예를들어 강 의코드는 ㄱ 이 00010 (0x02), ㅏ 가 00011 (0x03), 이 01100 (0x0C) 이 되어다음그림처럼된다. 그리고 강 이라는글자의코드값은 16 진수로 0x886C (2 진수 1000100001101100) 가된다. High-Byte Low-Byte 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 초성 5-Bit 초성 ' ㄱ ' 0x02 중성 5-Bit 중성 ' ㅏ ' 0x03 종성 5-Bit 종성 ' ㅇ ' 0x0C MSB = 1 Hangul Bit Flag
한글초성값 1 채움 2 ㄱ 3 ㄲ 4 ㄴ 5 ㄷ 6 ㄸ 7 ㄹ 8 ㅁ 9 ㅂ 10 ㅃ 11 ㅅ 12 ㅆ 13 ㅇ 14 ㅈ 15 ㅉ 16 ㅊ 17 ㅋ 18 ㅌ 19 ㅍ 20 ㅎ 한글중성값 2 채움 3 ㅏ 4 ㅐ 5 ㅑ 6 ㅒ 7 ㅓ 10 ㅔ 11 ㅕ 12 ㅖ 13 ㅗ 14 ㅘ 15 ㅙ 18 ㅚ 19 ㅛ 20 ㅜ 21 ㅝ 22 ㅞ 23 ㅟ
26 ㅠ 27 ㅡ 28 ㅢ 29 ㅣ 한글종성값 1 채움 2 ㄱ 3 ㄲ 4 ㄳ 5 ㄴ 6 ㄵ 7 ㄶ 8 ㄷ 9 ㄹ 10 ㄺ 11 ㄻ 12 ㄼ 13 ㄽ 14 ㄾ 15 ㄿ 16 ㅀ 17 ㅁ 19 ㅂ 20 ㅄ 21 ㅅ 22 ㅆ 23 ㅇ 24 ㅈ 25 ㅊ 26 ㅋ 27 ㅌ 28 ㅍ 29 ㅎ 3.2. 완성형한글코드그러나정부에서는완성형을표준으로채택했다.(KS C 5601, KS X 1001) 완성형은앞 byte는 0xb0부터 0xc8까지 (25개), 뒤 byte는 0xa1부터 0xfe까지 (94개) 를한글영역으로사용한다. 따라서 25 94 = 2350자를표현할수있다. 이론상가능한현대한글은모두 11172자 ( = 초성 19 중성 21 종성 28 ) 인데
이들을다표현하지는못하고이들중빈도가높은것 2350자만뽑아서 code를배정한것이다. 위에서말한영역에 ' 가 ' 부터 ' 힝 ' 까지가나다순대로 2350자가배정되어있다. 그리고한자는앞 byte 0xca부터 0xfd까지 (52개), 뒤 byte 0xa1부터 0xfe까지 (94개) 에배정되어있다. 따라서한자는 4888자 (52 94) 가표현될수있다. 두번째바이트 A1 FE A1 특수문자영역 AC 첫번째바이트 B0 C8 가각간... 한글영역 (2,350 자 )... 힙힛힝 CA 伽佳假... 한자영역 (4,888 자 ) FD... 稀羲詰 FE KS X 1001(KS C 5601) 완성형한글의가장큰단점으로지적된것은이코드로표현할수있는한글이 2350자로제한된다는것이다. 이를보완하기위해서마이크로소프트에서윈도98을출시하면서마이크로소프트통합형한글 (Microsoft Unified Hangul) 이라는한글코드체계를사용하게되었다. 이코드체계에서는한글 8822자 (=11172-2350) 를새로정의해서배열하면서, 한글코드값을기존의완성형코드값과겹치지않는코드범위에서할당했기때문에사전순으로코드값이할당되지않았다. ( 자모순-코드순의불일치 )
마이크로소프트통합형한글코드 (Microsoft Unfiied Hangul) 11,172 자 KS C 5601-1987 ( 완성형한글코드 ) 한글 2,350 자 Lead Byte (High-Byte) Trail Byte (Low Byte) 0xA1-0xFE 0xA1-0xFE 통합형한글코드에서추가 한글 8,822 자 Lead Byte (High-Byte) Trail Byte (Low Byte) 0x81-0xA0 0x41-0x5A, 0x61-0x7A, 0x81-0xFE 0xA1-0xC6 0x41-0x5A, 0x61-0x7A, 0x81-0xA0 연번 KS C 5601 코드 통합형코드 한글 1 0xB0A1 0xB0A1 가 2 0xB0A2 0xB0A2 각 3-0x8141 갂 4-0x8142 갃 5 0xB0A3 0xB0A3 간 6-0x8143 갅 7-0x8144 갆 8 0xB0A4 0xB0A4 갇 9 0xB0A5 0xB0A5 갈 10 0xB0A6 0xB0A6 갉 11 0xB0A7 0xB0A7 갊 12-0x8145 갋 13-0x8146 갌 14-0x8147 갍 15-0x8148 갎 16-0x8149 갏 4. 일본과중국의문자표준 한자를많이쓰는일본과중국에서도한국과비슷하게 1 byte 문자만으로부족하여 나름의 2 byte 문자 code 체계를고안하여사용하고있다. 일본에서는 JIS(Japan Industrial Standard) 라는 code 체계및이것을변형한 Shift-JIS 를
많이사용하고있다. 이밖에 EUC(extended unix characterset)-jp 도많이사용된다. 簡體를주로사용하는중국 ( 대륙 ) 에서채택된표준은 GB, 繁體를주로사용하는대만에서채택된표준은 Big5 라고한다. 한중일각각은다른나라에서한자를어느영역에배정했는지에관심을두지않고자기나름대로의 code 체계를정했기때문에같은글자 ( 한자 ) 가서로다른 code 값을배정받게되었고코드영역이서로겹치게되었다. 따라서하나의문서내에서한글, 가나, 한자 ( 번체자, 간체자, 일본에서사용되는약자 ) 등을섞어서사용하기가어렵게된것이다. 5. 유니코드 5.1. History 이러한국가간코드영역의중복문제를해소하기위해 ( 사실은 MS사에서자사제품의지역화 (localization) 비용을줄이기위해서유니코드체제를강력히후원해오고있음 ) 각국대표들이모여세계의모든문자들을동시에표현할수있으면서각문자가서로겹치지않는통일된문자 code 체계를만드는방안을논의하게되었다. 이회의는유니코드컨소시엄에서주관하고있으며유니코드 version 6.0.0까지나와있다. (http://www.unicode.org 참조 ) ISO( 국제표준기구 ) 에서도유니코드를표준으로채택하고있다.(ISO/IEC 10646) 5.2. 인코딩방식 유니코드의문자인코딩방식에는 UTF-8, UTF-16(UCS2), UTF-32(UCS4) 의 3 가지가있다. UTF-32 (UCS4) 모든문자를 4 byte(32 bit) 로표현한다. 따라서 2 32 = 4,294,967,296 개의문자들을구별하여표상할수있다. 표상방식이가장깔끔하나하나의문자를저장하는데 4 byte나소요된다는단점이있다. UTF-16 (UCS2) BMP(basic multilingual plane) 에속하는문자는 2 byte로표현. 2 byte는 16 bit이므로 2 16 = 65,536 개의기호가구분될수있다 (U+0000~U+FFFF). supplementary plane에속하는문자는 (U+10000~U+10FFFF) 16 bit 코드단위 2개의쌍으로표현 (surrogate pair) 영문자, 한글, 한자의상당부분 ( 한중일통합한자, Extension-A), 일본가나등일상적으로사용되는대부분의문자는 BMP에속하므로 2 byte로표현된다. 한자중 Extension-B, Extension-C 등은 4 byte로표현된다.
UTF-8 영문자 ( 대문자, 소문자 ), 숫자, 기본적인기호등의 128개문자는 1 byte로표현하고 (0x00~0x7F) 그외의문자는 2~4 byte로표현한다. 하나의문자를표현하는 byte 수가가변적이라는단점이있으나 ASCII-compatible하다는장점이있다. ---> ASCII 텍스트만을고려한프로그램들을이용할수있음. 5.3. 유니코드와한글 유니코드 (UTF-16) 에서한글은 0xAC00 부터 0xD7A3 까지 (11172 자 ) 가나다순으로배정되어있 음. 유니코드에서초성, 중성, 종성알아내는방법알아내고자하는한글음절의 code 값을 X라하면초성값 = ( X - 0xac00 ) / 588 Y = (X - 0xac00 ) % 588 중성값 = Y / 28 종성값 = Y % 28 자음과모음각자소 ( 옛한글포함 ) 도따로코드배정 5.3.1. 유니코드와옛한글, 구결자국어사자료에는옛한글, 구결자등특수한문자가많이사용된다. ASCII, 완성형, 조합형등의코드체계에서는옛한글, 구결자를표상할수없다. 보석글 이라는워드프로세서에서처음으로옛한글에코드를배당하여표상. 한글과컴퓨터사의 글 워드프로세서의 HNC 코드에서도옛한글에코드를배당. 그후구결자에도코드배당. 유니코드의대두에따라 2000년무렵한글과컴퓨터사 ( 글), 한국 MS(MS Word), 삼성전자 ( 훈민워드 ) 는각각자사제품을유니코드기반으로뜯어고치는과정에서유니코드에코드를배정받지못한옛한글, 구결자등을처리하는방식을 3사가통일하기로협의. 사용자정의영역 (private use area) 에옛한글과구결자를배당하고이를화면상에표현할수있도록글꼴도제작함. ( 글: 한컴돋움, 한컴바탕등 ; MS: 새굴림, 새돋움, 새바탕, 새궁서등 ) 한글 2010, MS-Word 2007 부터는옛한글표현방식이다시바뀌었음. 유니코드의한글자모영역에배당된초성, 중성, 종성을조합하여하나의음절을나타냄.
종성이없는음절 : 초성 + 중성 = 4 바이트 종성이있는음절 : 초성 + 중성 + 종성 = 6 바이트 5.4. 유니코드텍스트문서의 Endianness Big Endian 과 Little Endian 보통 LE 을사용. 6. 코드변환 하나의파일을필요에따라여러코드체계로변환할필요가있다. 6.1. 텍스트에디터나워드프로세서의 [Save as, 다른이름으로저장 ] 메뉴를이용하는방법 2002는유니코드텍스트문서는스스로알아서읽는다. 그러나 KS 코드나 KSSM 코드는미리그코드로작성되어있다는사실을알려주어야바르게읽을수있다. 저장할때에도유니코드텍스트로저장을선택하면스스로저장하고, 텍스트로저장하면 KS 코드나 KSSM 코드중어느것으로저장할것인가를묻는다. 그러나 97은유니코드로읽거나저장할때에미리알려주어야한다는사실을염두에두어야한다. EmEditor( 울트라에디트포함 ) 는유니코드와 KS코드로작성된문서는알아서읽어들인다. 저장할때에도 표준ANSI 나 한국어 (949) 로저장하면 KS 코드로저장이된다. KSSM 코드도저장및읽기가가능하나간혹완성형파일로오인하는경우가있다. 그럴때는 Reload 메뉴에서조합형이라고지정해서다시읽어들인다. 6.2. 윈도즈용코드변환프로그램을이용하는방법 워디안, 2002에는 한컴파일형식변환기 (HwpConv.Exe) 라는프로그램이포함되어있다. 이프로그램은각종코드를상호변환해주고있어서편리하게사용할수있다. 프로그램을실행하여 [ 추가 ] 버튼을누르면변환을원하는파일을몇개든지선택할수있도록되어있고, 다시 [ 변환 ] 버튼을누르면변환을원하는코드를선택할수있게되어있다. 단지텍스트파일뿐만아니라, 파일의변환도할수있다는장점이있다.
6.3. 콘솔용코드변환프로그램을이용하는방법 사실대부분의코드변환은첫째, 둘째방법을이용해서무난하게처리할수있다. 그러나배치처리시에는콘솔용프로그램도필요하게된다. 따라서콘솔용코드변환프로그램도준비해놓고사용할필요가있다. 콘솔용코드변환프로그램에는카멜레온, H2K, Uniconv 등이있다. Uniconv: 유니코드및기타여러인코딩 ( 코드페이지 ) Chamel: 조합형 <-> 완성형 H2K: 글 <-> 조합형 카멜레온 (chamel) 은한글코드변환공개프로그램으로이프로그램을수행하는방법은다음 과같다. CHAMEL / 옵션 file1 file2 이는 CHAMEL /FK old.txt new.txt과같이사용될수있는데, / 뒤에 FK 는옵션으로, 첫번째문자는원래파일의한글코드를, 두번째문자는변환할목적파일의한글코드를나타낸다. FK 는 KS완성형코드를상용조합형코드로변환하라는뜻이다. 카멜레온은 10가지나넘는코드를변환하도록만들어졌지만, 대부분요즘에는사용되지않는코드들이므로따로설명하지않는다. 일반적으로 FK 나 KF 옵션이사용될수있다. old.txt는원래파일이고, new.txt는목적파일이다. 즉, 변환을원하는파일이름을앞에적고, 변환되어생성될파일의이름을뒤에적으면된다. 그러므로위에예를든명령은 KS완성형으로작성된 old.txt라는파일을읽어서한글코드를상용조합형으로변환하여 new.txt라는파일로저장하라는뜻이다.