성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] A graphical depiction of the steps ...
[정성태] 질문을 주셔서 출판사 측에 문의를 했습니다. 약 한 달 정도 후...
[Thorondor
] @정성태 개인 블로그인데도 거의 커뮤니티 급 인 것 같아요. 요...
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>유니코드와 한글 - "Hangul Compatibility Jamo"</h1> <p> 우선, 우리에게 "완성형 한글"이라고 알려진 KS C 5601-1987에 대한 것부터 살펴보겠습니다. 다음의 문서를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > KSC 5601 - S-Space - 서울대학교 ; <a target='tab' href='http://s-space.snu.ac.kr/bitstream/10371/61586/3/1.snulib_v127_004.pdf'>http://s-space.snu.ac.kr/bitstream/10371/61586/3/1.snulib_v127_004.pdf</a> </pre> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> KSC 5601 은 94x94 의 각 위치(행열)에 한 글 문자를 일정한 순서에 따라 배열해<br /> 놓은 문자세트를 의미한다. 한글 코 드 의 KS 제정에서 완성형이 채택된 것은 내부<br /> 적으로 한글 의 출력이 모아쓰기 형태로 이 루 어지면서 한자 를 섞어서 쓸 수 있어야<br /> 한다는 사회적 요구로 조합형을 수용하기가 어려웠기 때문이다. 또 다른 배경은 국<br /> 가 간의 정보교환을 위한 코드 표준화 과정에서 ISO 2022 에서 제정한 코드 체계에<br /> 따라 세계 각국의 문자를 처리하는데 기인한다. 이 는 1 바이트 코드로 한 문자 표현<br /> 이 불가능한 CJK(Chinese, Japanese, Korean) 문자를 2바이트 코드 영역의 첫 번째<br /> 영역에 넣을 수 있도록 영역을 확보해야 했기 때문이다.<br /> 이와 같은 배경에 의해 KSC 5601-1982 에 의한 2 바이트 조합형 코드가, 1987년에<br /> 2바이트 완성형 코 드 인 정보교환용 부호에 관한 한글 공업 규격으로 새로 바뀌게<br /> 된 것이다.<br /> </div><br /> <br /> KSC 5601 표준에 포함된 문자의 구성은 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 완성형 한글 2,350자 한자 4,888자 기술/학술기호 등 특수문자 432자 숫자 30자 한글 낱자 94자 로마문자 52자 그리스 문자 48자 패션 조각 68자 라틴 문자 27자 일본 문자 169자 러시아 문자 66자 --------- 총 8,224자 기타 사용자 정의 영역으로 한글 96자 한자 95자 정도를 사용하도록 배정 --------- 94 x 94 영역을 가지기 때문에 총 8,836 문자를 표현 가능 </pre> <br /> Unicode 표준의 인코딩으로 UTF-8, UTF-16, UTF-32가 있는 것처럼, ks_c_5601-1987 표준안의 인코딩 방식으로는 euc-kr과 ISO-2022-KR이 있습니다. KSC 5601의 문자 셋이 94x94의 행렬에 배치한 것이라고 하는데 실제로 다음의 문서에서 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Korean Graphic Character Set, Korean Standard KSC 5601-1987 ; <a target='tab' href='https://www.itscj.ipsj.or.jp/iso-ir/149.pdf'>https://www.itscj.ipsj.or.jp/iso-ir/149.pdf</a> INTERNATIONAL REGISTER OF CODED CHARACTER SETS TO BE USED WITH ESCAPE SEQUENCES ; <a target='tab' href='https://www.itscj.ipsj.or.jp/itscj_english/iso-ir/ISO-IR.pdf'>https://www.itscj.ipsj.or.jp/itscj_english/iso-ir/ISO-IR.pdf</a> </pre> <br /> 그리고 KS X 시리즈로 나가는 표준안의 이름이 각각 다음과 같이 대응합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <a target='tab' href='https://ko.wikipedia.org/wiki/KS_X_1001'>KS X 1001</a> - 한국 산업 규격의 한글 문자 집합 (ks_c_5601-1987이었으며 개정된 연도를 반영해 KS X 1001:2004가 최신임) <a target='tab' href='https://ko.wikipedia.org/wiki/KS_X_1002'>KS X 1002</a> - KS X 1001의 보조 문자 집합 (과거 ks_c_5687이었으며 개정된 연도를 반영해 KS X 1002:2001이 최신임) KS X 1001의 보조 문자 집합이기 때문에 KS X 1001에서는 "쓩"과 같은 문자를 표현할 수 없었던 것을 KS X 1002에서 해결. 반면, "뷁"이라는 글자 등은 포함하고 있지 않음. <a target='tab' href='https://ko.wikipedia.org/wiki/KS_X_1003'>KS X 1003</a> - KS X 1001과 함께 사용되는 로마 문자 집합(ks_c_5636이었으며 개정된 연도를 반영해 KS X 1003:2003이 최신임) </pre> <br /> 마이크로소프트의 윈도우 환경 개발자들은 지금까지 설명한 ks_c_5601-1987 용어를 주의해야 합니다. 한글 윈도우에서 구현한 인코딩은 기존 KS X 1001의 문자 셋을 포함해 한글의 표현을 11,172자까지 확장한 MS949(x-windows-949, Unified Hangul Code)인데, 마이크로소프트가 이 용어를 인코딩 이름으로 사용하지 않고 "ks_c_5601-1987"로 사용하고 있기 때문입니다. 즉, 일반적으로 euc-kr은 ks_c_5601-1987 표준안에 대한 인코딩 방식인데 윈도우 환경에서는 "ks_c_5601-1987" 인코딩이 MS949의 인코딩 이름이 된 것입니다. 같은 의미로 CP949가 있는데 이것은 윈도우 운영체제의 Code Page 값이 949라는 것으로 MS949 인코딩의 코드 페이지를 반영한 이름이며 이런 식으로 보면 euc-kr은 CP51949라고 표현할 수 있는 정도로 보면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Code Page Identifiers ; <a target='tab' href='https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers'>https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers</a> </pre> <br /> 이제 유니코드로 넘어가겠습니다. 마이크로소프트의 확장 한글이 11,172자의 한글을 표현한다고 했는데 유니코드 역시 초성 19개, 중성 21개, 종성 27개의 조합으로 구성한 19 * 21 * 28 = 11,172자의 글자를 표현합니다. (종성의 조합이 28이 된 것은 종성이 없는 글자도 있기 때문입니다.) 물론 코드 표의 값은 완전히 다릅니다. 가령 다음은 유니코드의 한글 코드인데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [유니코드] 0xAC00 == 가 0xAC01 == 각 0xAC02 == 갂 </pre> <br /> KS X 1001(euc-kr)에는 '갂'이라는 글자가 없습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [euc-kr] 0xB0A1 == 가 0xB0A2 == 각 0xB0A3 == 간 </pre> <br /> KS X 1001을 확장한 MS949는 11,172자를 표현하는데 그중에 '갂'이 포함되어 있고 코드는 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [ms949] 0xB0A1 == 가 0xB0A2 == 각 <span style='color: blue; font-weight: bold'>0x8141</span> == 갂 </pre> <br /> 보는 바와 같이 euc-kr 과의 호환을 지키기 위해 ms949는 0xb0a1...에서 차례로 단어를 지정하지 못하고 엉뚱하게 0x8100 등의 기점으로 튀는 문제가 발생합니다. 이로 인해 사실상 ms949 데이터와 유니코드가 동일한 글자 수를 포함하고 있으면서도 서로 변환을 할 수 있는 일정한 규칙이 없습니다. 결국 변환은 코드 테이블의 매핑 문제로 해결할 수 있고 이에 대해서는 다음의 공식 문서에 잘 정리되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Korean Hangul Encoding Conversion Table ; <a target='tab' href='http://unicode.org/Public//MAPPINGS/OBSOLETE/EASTASIA/KSC/HANGUL.TXT'>http://unicode.org/Public//MAPPINGS/OBSOLETE/EASTASIA/KSC/HANGUL.TXT</a> 한글과 함께 ms949의 전체 문자를 포함하는 Code Page 949 영역의 문자에 대한 유니코드 변환 테이블 cp949 to Unicode table ; <a target='tab' href='http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT'>http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT</a> </pre> <br /> 아울러 전체 유니코드에 대한 코드 표는 다음의 공식 문서에서 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unicode 11.0 Character Code Charts ; <a target='tab' href='http://www.unicode.org/charts/'>http://www.unicode.org/charts/</a> </pre> <br /> 이 중에서 한글 코드 표는 "Hangul Syllables"와 "Hangul Jamo"에 해당합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Hangul Syllables (AC00 - D7AF) ; <a target='tab' href='http://www.unicode.org/charts/PDF/UAC00.pdf'>http://www.unicode.org/charts/PDF/UAC00.pdf</a> Hangul Jamo (Range: 1100 - 11FF) ; <a target='tab' href='http://www.unicode.org/charts/PDF/U1100.pdf'>http://www.unicode.org/charts/PDF/U1100.pdf</a> </pre> <br /> 일단 "Hangul Syllables"는 완성형 문자 하나씩 코드 표에 대응하는 반면 "Hangul Jamo"는 완성형 문자의 초성, 중성, 종성에 해당하는 코드 표를 가집니다. 유니코드의 "Hangul Jamo" 코드 표가 특이한 것은, 같은 'ㄱ'인데도 초성이냐, 종성이냐를 구분한다는 것입니다. 하지만, 그냥 하나의 글자로서의 'ㄱ'은 담고 있지 않습니다.<br /> <br /> 여기서 문제는, 기존에 널리 쓰이던 euc-kr, ms949 방식의 인코딩에서는 초성/종성을 구분하지 않는 코드 표가 있다는 점입니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='hangul_compat_1.png' src='/SysWebRes/bbs/hangul_compat_1.png' /><br /> <br /> 저렇게 4행에 있는 94개의 코드가 초성/종성을 구분하지 않는 자모에 대한 코드 표가 있는데, 따라서 "euc-kr, ms949"와 "unicode" 사이의 데이터 변환이 "Hangul Syllables"와 "Hangul Jamo"만으로는 자연스럽게 이뤄질 수 없습니다. 이러한 호환 문제를 해결하는 코드 표가 바로 "Hangul Compatibility Jamo"입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Hangul Compatibility Jamo (3130 - 318F) ; <a target='tab' href='http://www.unicode.org/charts/PDF/U3130.pdf'>http://www.unicode.org/charts/PDF/U3130.pdf</a> 그 외 <a target='tab' href='http://www.unicode.org/charts/PDF/UA960.pdf'>Hangul Jamo Extended-A(A960 - A97F)</a>, <a target='tab' href='http://www.unicode.org/charts/PDF/UD7B0.pdf'>Hangul Jamo Extended-B(D7B0 - D7FF)</a>, <a target='tab' href='http://www.unicode.org/charts/PDF/UFF00.pdf'>Halfwidth Jamo</a> 영역이 있지만 이 글에서는 다루지 않습니다. </pre> <br /> 좀 더 생각해 보면, "Hangul Compatibility Jamo"가 반드시 호환만을 위해 나오진 않았을 것 같습니다. 왜냐하면 분명히 초성/종성을 구분하지 않는 글자로서의 'ㄱ'도 필요하기 때문에, 어차피 유니코드에 포함시켜야 했겠지만 마침 기존 인코딩과의 호환도 있고 해서 그 영역에 자연스럽게 포함시킨 것이 아닌가 합니다. (물론, 이것은 제 개인적인 추측입니다. ^^)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 위에서 설명했지만, 유니코드의 경우 ms949와는 달리 11,172 글자를 일렬로 자모의 조합 규칙에 맞게 배치했으므로 초성, 중성, 종성에 대한 분리가 매우 쉽습니다. 이에 대해서는 다음의 공식 문서에,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > The Unicode Standard Version 7.0 - Core Specification ; <a target='tab' href='http://www.unicode.org/versions/Unicode7.0.0/ch03.pdf#G24646'>http://www.unicode.org/versions/Unicode7.0.0/ch03.pdf#G24646</a> </pre> <br /> Java 언어로 싣고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // Sample Code for Hangul Algorithms static final int SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7, LCount = 19, VCount = 21, TCount = 28, NCount = VCount * TCount, // 588 SCount = LCount * NCount; // 11172 public static String decomposeHangul(char s) { int SIndex = s - SBase; if (SIndex < 0 || SIndex >= SCount) { return String.valueOf(s); } StringBuffer result = new StringBuffer(); int L = LBase + SIndex / NCount; int V = VBase + (SIndex % NCount) / TCount; int T = TBase + SIndex % TCount; result.append((char)L); result.append((char)V); if (T != TBase) result.append((char)T); return result.toString(); } </pre> <br /> 초성 19, 중성 21, 종성 27 + 1로 이뤄진 조합 규칙의 나열이라는 것을 감안하면 저 소스 코드가 이해가 될 것입니다. 닷넷의 경우, 위의 코드를 간단하게 변환해서 사용할 수도 있겠지만 <a target='tab' href='https://www.sysnet.pe.kr/2/0/1294#5'>string.Normalize 메서드를 이용해 분리</a>가 되므로 굳이 만들 필요는 없습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 지금까지 읽은 지식으로 다시 예전에 설명했던,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 유니코드와 한글 - 유니코드와 닷넷을 이용한 한글 처리 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1294'>http://www.sysnet.pe.kr/2/0/1294</a> </pre> <a name='nfd'></a> <br /> NFD (정준 분해)와 NFKD (호환 분해)를 보겠습니다. 'ㄱ'과 '각'이라는 글자를 우선 NFD 분해해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ㄱ: 12593 // "Hangul Compatibility Jamo" 영역의 'ㄱ' ㄱ: 4352 // "Hangul Jamo" 영역의 초성 'ㄱ' </pre> <br /> 각자의 영역에 맞게 분해 값이 나옵니다. 반면 NFKD 분해를 하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ㄱ: 4352 // "Hangul Jamo" 영역의 초성 'ㄱ' ㄱ: 4352 // "Hangul Jamo" 영역의 초성 'ㄱ' </pre> <br /> "Hangul Compatibility Jamo" 영역의 자모를 "Hangul Jamo" 영역의 자모로 변환하는 것을 볼 수 있습니다. 그렇다면 혹시, 반대로 "Hangul Jamo" 영역의 자모를 "Hangul Compatibility Jamo" 영역의 자모로 변환할 수 있는 방법이 있을까요?<br /> <br /> 그 두 가지 영역의 관계를 보면 별다르게 변환 방법이 있어 보이지는 않습니다. 따라서 이런 경우에는 변환 테이블을 만들어 쉽게 해결할 수 있는데, 만드는 방법은 "Hangul Compatibility Jamo" 영역이 ms949와의 호환 영역이라는 것을 고려해서 다음과 같이 인코딩과 역인코딩을 해 구할 수 있습니다.<br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Collections.Generic; using System.Text; class Program { static Encoding ms949enc = Encoding.GetEncoding("ks_c_5601-1987"); static void Main(string[] args) { Dictionary<int, int> table = new Dictionary<int, int>(); for (int i = 0; i < (0x11FF - 0x1100); i++) // Hangul Jamo 영역 { char ch = (char)(0x1100 + i); string s = new string(ch, 1); string syllable = s.Normalize(System.Text.NormalizationForm.FormD); AddTable(table, syllable[0]); if (syllable.Length == 3) { AddTable(table, syllable[2]); } } // 매핑 테이블을 위한 C# 소스 코드 생성 Console.WriteLine("Dictionary<short, short> jamoToCompatJamo = new Dictionary<short, short>()"); Console.WriteLine("{"); Console.WriteLine(" // [Hangul Jamo] to [Hangul Compatibility Jamo]"); foreach (var item in table) { Console.WriteLine(" {" + item.Value + "," + item.Key + "}, // " + (char)item.Key + "' == '" + (char)item.Value + "'"); } Console.WriteLine("};"); } private static void AddTable(Dictionary<int, int> table, char ch) { char compatCh = ConvertToCompatibiltyJamo(ch); if (compatCh == '?') // '?' == fallback character { return; } table[(short)ch] = compatCh; } private static char ConvertToCompatibiltyJamo(char ch) { byte[] buf = ms949enc.GetBytes(ch.ToString()); string txt = ms949enc.GetString(buf); return txt[0]; } } </pre> <br /> 출력 결과는 다음과 같습니다.<br /> <br /> <pre style='height: 400px; margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Dictionary<short, short> jamoToCompatJamo = new Dictionary<short, short>() { // [Hangul Jamo] to [Hangul Compatibility Jamo] {12593,4352}, // ㄱ' == 'ㄱ' {12594,4353}, // ㄲ' == 'ㄲ' {12596,4354}, // ㄴ' == 'ㄴ' {12599,4355}, // ㄷ' == 'ㄷ' {12600,4356}, // ㄸ' == 'ㄸ' {12601,4357}, // ㄹ' == 'ㄹ' {12609,4358}, // ㅁ' == 'ㅁ' {12610,4359}, // ㅂ' == 'ㅂ' {12611,4360}, // ㅃ' == 'ㅃ' {12613,4361}, // ㅅ' == 'ㅅ' {12614,4362}, // ㅆ' == 'ㅆ' {12615,4363}, // ㅇ' == 'ㅇ' {12616,4364}, // ㅈ' == 'ㅈ' {12617,4365}, // ㅉ' == 'ㅉ' {12618,4366}, // ㅊ' == 'ㅊ' {12619,4367}, // ㅋ' == 'ㅋ' {12620,4368}, // ㅌ' == 'ㅌ' {12621,4369}, // ㅍ' == 'ㅍ' {12622,4370}, // ㅎ' == 'ㅎ' {12645,4372}, // ㅥ' == 'ㅥ' {12646,4373}, // ㅦ' == 'ㅦ' {12653,4378}, // ㅭ' == 'ㅭ' {12654,4380}, // ㅮ' == 'ㅮ' {12657,4381}, // ㅱ' == 'ㅱ' {12658,4382}, // ㅲ' == 'ㅲ' {12659,4384}, // ㅳ' == 'ㅳ' {12612,4385}, // ㅄ' == 'ㅄ' {12660,4386}, // ㅴ' == 'ㅴ' {12661,4387}, // ㅵ' == 'ㅵ' {12662,4391}, // ㅶ' == 'ㅶ' {12663,4393}, // ㅷ' == 'ㅷ' {12664,4395}, // ㅸ' == 'ㅸ' {12665,4396}, // ㅹ' == 'ㅹ' {12666,4397}, // ㅺ' == 'ㅺ' {12667,4398}, // ㅻ' == 'ㅻ' {12668,4399}, // ㅼ' == 'ㅼ' {12669,4402}, // ㅽ' == 'ㅽ' {12670,4406}, // ㅾ' == 'ㅾ' {12613,4412}, // ㅅ' == 'ㅅ' {12614,4413}, // ㅆ' == 'ㅆ' {12613,4414}, // ㅅ' == 'ㅅ' {12614,4415}, // ㅆ' == 'ㅆ' {12671,4416}, // ㅿ' == 'ㅿ' {12674,4421}, // ㆂ' == 'ㆂ' {12675,4422}, // ㆃ' == 'ㆃ' {12672,4423}, // ㆀ' == 'ㆀ' {12615,4428}, // ㅇ' == 'ㅇ' {12616,4430}, // ㅈ' == 'ㅈ' {12617,4431}, // ㅉ' == 'ㅉ' {12616,4432}, // ㅈ' == 'ㅈ' {12617,4433}, // ㅉ' == 'ㅉ' {12618,4436}, // ㅊ' == 'ㅊ' {12618,4437}, // ㅊ' == 'ㅊ' {12676,4439}, // ㆄ' == 'ㆄ' {12677,4440}, // ㆅ' == 'ㆅ' {12678,4441}, // ㆆ' == 'ㆆ' {12644,4447}, // ㅤ' == 'ㅤ' {12623,4449}, // ㅏ' == 'ㅏ' {12624,4450}, // ㅐ' == 'ㅐ' {12625,4451}, // ㅑ' == 'ㅑ' {12626,4452}, // ㅒ' == 'ㅒ' {12627,4453}, // ㅓ' == 'ㅓ' {12628,4454}, // ㅔ' == 'ㅔ' {12629,4455}, // ㅕ' == 'ㅕ' {12630,4456}, // ㅖ' == 'ㅖ' {12631,4457}, // ㅗ' == 'ㅗ' {12632,4458}, // ㅘ' == 'ㅘ' {12633,4459}, // ㅙ' == 'ㅙ' {12634,4460}, // ㅚ' == 'ㅚ' {12635,4461}, // ㅛ' == 'ㅛ' {12636,4462}, // ㅜ' == 'ㅜ' {12637,4463}, // ㅝ' == 'ㅝ' {12638,4464}, // ㅞ' == 'ㅞ' {12639,4465}, // ㅟ' == 'ㅟ' {12640,4466}, // ㅠ' == 'ㅠ' {12641,4467}, // ㅡ' == 'ㅡ' {12642,4468}, // ㅢ' == 'ㅢ' {12643,4469}, // ㅣ' == 'ㅣ' {12679,4484}, // ㆇ' == 'ㆇ' {12680,4485}, // ㆈ' == 'ㆈ' {12681,4488}, // ㆉ' == 'ㆉ' {12682,4497}, // ㆊ' == 'ㆊ' {12683,4498}, // ㆋ' == 'ㆋ' {12684,4500}, // ㆌ' == 'ㆌ' {12685,4510}, // ㆍ' == 'ㆍ' {12686,4513}, // ㆎ' == 'ㆎ' {12593,4520}, // ㄱ' == 'ㄱ' {12594,4521}, // ㄲ' == 'ㄲ' {12595,4522}, // ㄳ' == 'ㄳ' {12596,4523}, // ㄴ' == 'ㄴ' {12597,4524}, // ㄵ' == 'ㄵ' {12598,4525}, // ㄶ' == 'ㄶ' {12599,4526}, // ㄷ' == 'ㄷ' {12601,4527}, // ㄹ' == 'ㄹ' {12602,4528}, // ㄺ' == 'ㄺ' {12603,4529}, // ㄻ' == 'ㄻ' {12604,4530}, // ㄼ' == 'ㄼ' {12605,4531}, // ㄽ' == 'ㄽ' {12606,4532}, // ㄾ' == 'ㄾ' {12607,4533}, // ㄿ' == 'ㄿ' {12608,4534}, // ㅀ' == 'ㅀ' {12609,4535}, // ㅁ' == 'ㅁ' {12610,4536}, // ㅂ' == 'ㅂ' {12612,4537}, // ㅄ' == 'ㅄ' {12613,4538}, // ㅅ' == 'ㅅ' {12614,4539}, // ㅆ' == 'ㅆ' {12615,4540}, // ㅇ' == 'ㅇ' {12616,4541}, // ㅈ' == 'ㅈ' {12618,4542}, // ㅊ' == 'ㅊ' {12619,4543}, // ㅋ' == 'ㅋ' {12620,4544}, // ㅌ' == 'ㅌ' {12621,4545}, // ㅍ' == 'ㅍ' {12622,4546}, // ㅎ' == 'ㅎ' {12646,4550}, // ㅦ' == 'ㅦ' {12647,4551}, // ㅧ' == 'ㅧ' {12648,4552}, // ㅨ' == 'ㅨ' {12649,4556}, // ㅩ' == 'ㅩ' {12650,4558}, // ㅪ' == 'ㅪ' {12651,4563}, // ㅫ' == 'ㅫ' {12652,4567}, // ㅬ' == 'ㅬ' {12653,4569}, // ㅭ' == 'ㅭ' {12654,4572}, // ㅮ' == 'ㅮ' {12655,4573}, // ㅯ' == 'ㅯ' {12656,4575}, // ㅰ' == 'ㅰ' {12664,4582}, // ㅸ' == 'ㅸ' {12666,4583}, // ㅺ' == 'ㅺ' {12668,4584}, // ㅼ' == 'ㅼ' {12669,4586}, // ㅽ' == 'ㅽ' {12671,4587}, // ㅿ' == 'ㅿ' {12672,4590}, // ㆀ' == 'ㆀ' {12615,4592}, // ㅇ' == 'ㅇ' {12674,4593}, // ㆂ' == 'ㆂ' {12675,4594}, // ㆃ' == 'ㆃ' {12676,4596}, // ㆄ' == 'ㆄ' {12678,4601}, // ㆆ' == 'ㆆ' }; </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4487
(왼쪽의 숫자를 입력해야 합니다.)