성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그냥 RSS Reader 기능과 약간의 UI 편의성 때문에 사용...
[이종효] 오래된 소프트웨어는 보안 위협이 되기도 합니다. 혹시 어떤 기능...
[정성태] @Keystroke IEEE의 문서를 소개해 주시다니... +_...
[손민수 (Keystroke)] 괜히 듀얼채널 구성할 때 한번에 같은 제품 사라고 하는 것이 아...
[정성태] 전각(Full-width)/반각(Half-width) 기능을 토...
[정성태] Vector에 대한 내용은 없습니다. Vector가 닷넷 BCL...
[orion] 글 읽고 찾아보니 디자인 타임에는 InitializeCompon...
[orion] 연휴 전에 재현 프로젝트 올리자 생각해 놓고 여의치 않아서 못 ...
[정성태] 아래의 글에 정리했으니 참고하세요. C# - Typed D...
[정성태] 간단한 재현 프로젝트라도 있을까요? 저런 식으로 설명만 해...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Raymond Chen이 한글날에 밝히는 윈도우의 한글 자모 분리 현상</h1> <p> 우리에게는 "<a target='tab' href='http://www.yes24.com/Product/Goods/2690684'>레이몬드 첸의 윈도우 개발 282 스토리</a>"라는 책의 저자로 알려진 Raymond Chen이 이번에는 한글날에 맞춰 윈도우의 한글 자모 분리 현상에 대한 뒷이야기를 남겼습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > A consequence of being the first to adopt a standard is that you may end up being the only one to adopt it: The sad story of Korean jamo ; <a target='tab' href='https://devblogs.microsoft.com/oldnewthing/20201009-00/?p=104351'>https://devblogs.microsoft.com/oldnewthing/20201009-00/?p=104351</a> </pre> <br /> 우선 이해를 돕기 위해, 한글 문자를 맥과 윈도우에서 표현하는 방법을 알아보겠습니다.<br /> <br /> 윈도우의 경우, 가령 '각'이라는 문자를 <a target='tab' href='https://www.compart.com/en/unicode/U+AC01'>'각'을 나타내는 0xAC01 2바이트</a>로 나타냅니다.<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://www.compart.com/en/unicode/U+AC01'>U+AC01 '각'</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;' > [맥] - <a target='tab' href='https://www.compart.com/en/unicode/U+1100'>U+1100 'ᄀ'</a> - <a target='tab' href='https://www.compart.com/en/unicode/U+1161'>U+1161 'ᅡ'</a> - <a target='tab' href='https://www.compart.com/en/unicode/U+11A8'>U+11A8 'ᆨ'</a> </pre> <br /> 즉, 윈도우의 경우에는 '각'을 표현하기 위해 2바이트가 필요한 반면, 맥의 경우에는 6바이트가 필요(현실적으로는 UTF-8 인코딩을 하므로 윈도우는 3바이트, 맥은 9바이트)합니다. 이것을 <a target='tab' href='https://www.sysnet.pe.kr/2/0/1294#norm'>유니코드의 정규화</a> 관점에서 보면, 윈도우는 "NFC"를 따르고 맥의 경우에는 "NFD"를 따른다고 설명합니다.<br /> <br /> 문제는, ICU(Internationl Components for Unicode)도, iOS도, Android도 모두 U+1100, U+1161, U+11A8을 하나의 글자로 합쳐서 보여주는데, 왜 윈도우만 그것을 곧이곧대로 'ᄀ ᅡᆨ'으로 보여주냐는 것입니다. Raymond Chend은 이에 대해 '가장 먼저 표준을 도입하는 선발 주자로써 겪게 되는 아픔'의 한 사례라고 합니다. 실제로, 윈도우는 당시 한국의 산업 표준인 "KS X 1026"에 따라 NFC 방식이 되었다고 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Korean standard KS X 1026 ; <a target='tab' href='http://unicode.org/L2/L2008/08225-n3422.pdf'>http://unicode.org/L2/L2008/08225-n3422.pdf</a> </pre> <br /> 위의 문서에 "4. KS x 1026-1"을 보면,<br /> <br /> <ol> <li>Modern Hangul Syllable Blocks - Only code positions of Wanseong (Precomposed) Hangul Syllable block (UAC00 ~ D7A3)</li> <li>Old Hangul Syllable Blocks - Only code positions of Johab Hangul Jamo block (U11xx)</li> <li>Two or more code positions of simple letters cannot be concatenated to represent a complex letter.</li> <li>A Wanseong Syllable block (UAC00 ~ UD7A3) and Johab Hangul letter(s) (U11xx) cannot be concatenated to represent another Hangul Syllable block. Ÿ Implementation algorithms for separating, searching, sorting and normalizing Hangul text syllables.</li> </ol> <br /> (3번과 4번은 차치하고) 현대 한글은 <a target='tab' href='http://unicode.org/charts/PDF/UAC00.pdf'>"Hangul Syllables"에 해당하는 AC00 ~ D7A3 범위의 완성형 코드</a>를 쓰되, 옛한글(Old Hangul Syllable Blocks)은 <a target='tab' href='http://unicode.org/charts/PDF/U1100.pdf'>"Hangul Jamo"에 해당하는 1100 ~ 11FF 범위의 조합형 코드</a>로 쓴다고 언급이 됩니다. 즉, 일반적인 한글에 해당하는 '각'은 'ᄀ', 'ᅡ', 'ᆨ'로 따로 보관하지 않고 '각(U+AC01)'이라는 2바이트 완성형 한글을 쓰고, 옛 한글 - 예를 들어 '가ᇫ'이라는 글자는 맥에서처럼 "U+1100 U+1161 U+11EB"의 조합형으로 나타내라는 것입니다.<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;' > KS X 1026-1 ; <a target='tab' href='https://ko.wikipedia.org/wiki/KS_X_1026-1'>https://ko.wikipedia.org/wiki/KS_X_1026-1</a> </pre> <br /> 위의 문서에 "금지된 조합"을 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto;' > 1) 조합형 한글 낱자 여러 개를 이용하여 겹낱자를 표현하지 않는다. 예: ᄖ U+1116 (O), <span>ᄂ</span><span>ᄇ</span> U+1102 U+1107 (X) 2) 현대 한글 완성자는 반드시 한글 글자 마디(Hangul Syllables, U+AC00~U+D7AF) 영역의 문자로 표현해야 하며, 조합형 한글 낱자로 표현하지 않는다. 예: 한 U+D55C (O), ᄒ ᅡ ᆫ U+1112 U+1161 U+11AB (X) 3) 옛한글 완성자를 표현할 때 한글 글자 마디 영역의 문자와 조합형 한글 낱자를 섞지 않는다. 예: 가ᇫ U+1100 U+1161 U+11EB (O), 가ㅿ U+AC00 U+11EB (X) </pre> <br /> 두 번째 항목이 실제로 많이 볼 수 있는 맥의 표현으로 분명히 "KS X 1026-1" 표준 문서에는 그렇게 하지 말라고 명시하고 있습니다.<br /> <br /> 이런 설명과 함께, Raymond Chen은 윈도우가 잘못된 이유를 물을 것이 아니라, 오히려 다른 운영체제들의 잘못된 이유를 물어야 한다고 합니다. 즉, 아무도 지키지 않는 표준을 구현한 운영체제들 속에 단 하나의 표준을 구현한 운영체제가 잘못된 것처럼 보이게 된 것입니다.<br /> <br /> 어쨌든 결국, 이런 상황으로 인해 윈도우가 따르는 공식적인 표준인 NFC 방식과, 그 외의 운영체제들이 따르는 사실상의 표준인 NFD 방식으로 나뉘게 되었다고.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 저 스스로가 개발자이다 보니, 사실 개인적인 관점에서 보면 만약 한글을 구현해야 했다면 NFD 방식을 따랐을 것입니다. 왜냐하면... ^^; 그것이 더 구현이 쉽습니다. 완성형 한글 속에서 옛 한글은 조합형으로 표현해야 하는 "KS X 1026-1" 표준보다는 무조건 조합형으로 구현하는 NFD 방식이 확실히 구현상 쉽다는 이점이 있습니다.<br /> <br /> 그나저나, 여기서 글을 맺으면 좀 아쉽고 Raymond Chen의 글에 달린 덧글에 보면 반박글이 재미있습니다. 즉, 맥과 같은 운영체제들이 구현한 방식이 표준이 아니라고 하는데 사실 유니코드 표준에 NFD 방식의 구현이 "UAX #29" 문서로 명확하게 나와 있다는 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unicode® Standard Annex #29 ; <a target='tab' href='http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries'>http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries</a> </pre> <br /> (혹시... 저 현란한 문서 좀 정리해 주실 분 계실까요? ^^)<br /> <br /> 하지만 이에 대해서는 개인적으로 의문인 것이, 해당 문서의 초판 작성자가 "Authors Mark Davis (mark.davis@us.ibm.com)"으로 나오는데, 과연 저 문서를 작성할 때 한글 관련 부분에 대해 한국 측의 의견을 얼마나 잘 반영했느냐입니다. 혹시 이에 대한 이력을 아시는 한글 관련 전문가가 계시다면 덧글 부탁드리겠습니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
2036
(왼쪽의 숫자를 입력해야 합니다.)