#keywords BOM,UCS-2,UTF-16,UTF-8,ìœ ë‹ˆì½”ë“œ [[TableOfContents]] ''ì´ ë¬¸ì„œë¥¼ ì£¼ì˜ ê¹Šê²Œ ì½ìœ¼ë©´ ìœ ë‹ˆì½”ë“œì— ëŒ€í•œ ì´í•´ë¥¼ í¬ê²Œ ë†’ì¼ ìˆ˜ ìžˆì„ ê²ƒìž…ë‹ˆë‹¤.'' == ìœ ë‹ˆì½”ë“œ 개요 == > Unicode provides a unique number for every character, > no matter what the platform, > no matter what the program, > no matter what the language. > > - http://www.unicode.org/standard/WhatIsUnicode.html ìœ ë‹ˆì½”ë“œëŠ” ì „ 세계 ëª¨ë“ ë¬¸ìžì— 대해 플랫í¼ì— ìƒê´€ ì—†ì´, í”„ë¡œê·¸ëž¨ì— ìƒê´€ ì—†ì´, ì–¸ì–´ì— ìƒê´€ ì—†ì´ ì»´í“¨í„°ì—ì„œ ì¼ê´€ë˜ê²Œ í‘œí˜„í•˜ê³ ë‹¤ë£° 수 있ë„ë¡ ì„¤ê³„ëœ ì‚°ì—… 표준ì´ë‹¤. ìœ ë‹ˆì½”ë“œ 컨소시엄ì—ì„œ ì œì •í•˜ë©° ìœ ë‹ˆì½”ë“œ 표준ì—는 ISO 10646 ë¬¸ìž ì§‘í•©, ë¬¸ìž ì¸ì½”딩 방법, ë¬¸ìž ì •ë³´ ë°ì´í„°ë² ì´ìŠ¤, 문ìžë“¤ì„ 다루기 위한 ì•Œê³ ë¦¬ì¦˜ ë“±ì„ í¬í•¨í•˜ê³ 있다. ìœ ë‹ˆì½”ë“œì˜ ëª©ì ì€ í˜„ì¡´í•˜ëŠ” ë¬¸ìž ì¸ì½”딩 ë°©ë²•ë“¤ì„ ëª¨ë‘ ìœ ë‹ˆì½”ë“œë¡œ êµì²´í•˜ë ¤ëŠ” 것ì´ë‹¤. ê¸°ì¡´ì˜ ì¸ì½”ë”©ë“¤ì€ ê·¸ 규모나 범위 ë©´ì—ì„œ í•œì •ë˜ì–´ ìžˆê³ , 나ë¼ë§ˆë‹¤ ë‹¬ë¼ ì„œë¡œ 호환ë˜ì§€ 않는 ë¬¸ì œì ì´ ìžˆì—ˆë‹¤. ìœ ë‹ˆì½”ë“œê°€ 다양한 ë¬¸ìž ì§‘í•©ë“¤ì„ í†µí•©í•˜ëŠ” ë° ì„±ê³µí•˜ë©´ì„œ ìœ ë‹ˆì½”ë“œëŠ” 컴퓨터 ì†Œí”„íŠ¸ì›¨ì–´ì˜ êµì œí™”와 지ì—í™”ì— ë„리 사용ë˜ê²Œ ë˜ì—ˆë‹¤. ëª¨ë“ ë¬¸ìžë“¤ì˜ 코드 ê°’ì€ ë¬¸ìž ì½”ë“œí‘œì—ì„œ 확ì¸í• 수 있다. http://www.unicode.org/charts/ {{{+1 ë²„ì „ }}} {{{ - Unicode 1.0.0 - 1991ë…„ 10ì›” - ... - Unicode 6.0 - 2010ë…„ 10ì›” 11ì¼ - Unicode 6.1 - 2012ë…„ 2ì›” 1ì¼ - Unicode 6.2 - 2012ë…„ 9ì›” 27ì¼ - Unicode 6.3 - 2013ë…„ 9ì›” 30ì¼ - Unicode 7.0 - 2014ë…„ 6ì›” 16ì¼ }}} {{{+1 ìœ ë‹ˆì½”ë“œ í‰ë©´ }}} ìœ ë‹ˆì½”ë“œëŠ” 110만개 ì´ìƒì˜ 코드 í¬ì¸íŠ¸ë¥¼ ì§€ì •í• ìˆ˜ 있다. ìœ ë‹ˆì½”ë“œëŠ” ì´ 110만개 ì´ìƒì˜ 코드 í¬ì¸íŠ¸ë¥¼ 17ê°œì˜ 'í‰ë©´(Plane)'으로 ë‚˜ëˆ„ê³ ê° í‰ë©´ì—ì„œ 256*256=65,536ê°œì˜ ë¬¸ìžë¥¼ ì§€ì •í• ìˆ˜ 있다. 0번 í‰ë©´ì€ ì¼ë°˜ì 으로 BMP(Basic Multilingual Plane)ë¼ê³ 부르는 í‰ë©´ìœ¼ë¡œ BMPì—는 ê±°ì˜ ëª¨ë“ ê·¼ëŒ€ 문ìžì™€ 특수 문ìžê°€ í¬í•¨ë˜ì–´ 있으며, ê·¸ 중 ëŒ€ë¶€ë¶„ì€ í•œê¸€ê³¼ í•œì¤‘ì¼ í†µí•© í•œìžë“¤ë¡œ ì´ë£¨ì–´ì ¸ 있다. http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Roadmap_to_Unicode_BMP.svg/500px-Roadmap_to_Unicode_BMP.svg.png https://i-msdn.sec.s-msft.com/bb688113.f03tm07(ko-kr).jpg < BMP(í‰ë©´ 0)ì˜ ìœ ë‹ˆì½”ë“œ ë¬¸ìž ë°°ì¹˜ > 1번 í‰ë©´ì€ ë³´ì¡° 다êµì–´ í‰ë©´(Supplementary Multilingual Plane, SMP)으로 옛 문ìžë‚˜ ìŒì•… 기호, 수학 기호 ë“±ì— ì“°ì¸ë‹¤. 2번 í‰ë©´ì€ ë³´ì¡° ìƒí˜• ë¬¸ìž í‰ë©´(Supplementary Ideographic Plane, SIP)으로 초기 ìœ ë‹ˆì½”ë“œì— í¬í•¨ë˜ì§€ ì•Šì€ í•œì¤‘ì¼ í†µí•© í•œìžë¥¼ 주로 ë‹´ê³ ìžˆë‹¤. 3번 í‰ë©´ì¸ 3ì°¨ ìƒí˜• ë¬¸ìž í‰ë©´(Tertiary Ideographic Plane, TIP)ì€ ê°‘ê³¨ 문ìž, 금문, ì†Œì „ ë”°ìœ„ì˜ ë¬¸ìžë‚˜ 추가 í•œì¤‘ì¼ í†µí•© í•œìž, 기타 옛 ìƒí˜• ë¬¸ìž ë“±ì„ ìœ„í•´ ì˜ˆì•½ëœ ì˜ì—ì´ë‹¤. ìœ ë‹ˆì½”ë“œ 7.0 현재 3번 í‰ë©´ì—는 아무 문ìžë„ ì§€ì •ë˜ì§€ 않았다. ìœ ë‹ˆì½”ë“œ 4번 í‰ë©´ë¶€í„° 13번 í‰ë©´ì€ ë¯¸ì§€ì • í‰ë©´ìœ¼ë¡œ 현재 아무 문ìžë‚˜ ê¸°í˜¸ë„ ì§€ì •ë˜ì§€ 않았다. 14번 í‰ë©´ì¸ ë³´ì¡° 특수 목ì í‰ë©´(ì˜ì–´: Supplementary Special-purpose Plane, SSP)ì€ í˜„ìž¬ ì ì€ ìˆ˜ì˜ ì œì–´ìš© 문ìžë“¤ì´ 들어 있다. 15번과 16번 ë‘ í‰ë©´ì€ ì‚¬ìš©ìž ì˜ì—으로, íŠ¹ì • 업체나 ì‚¬ìš©ìž ë³„ë¡œ í• ë‹¹í•˜ì—¬ 쓰게 ë˜ë¯€ë¡œ 소프트웨어간ì´ë‚˜ ê¸€ê¼´ê°„ì˜ í˜¸í™˜ì„±ì´ ë³´ìž¥ë˜ì§€ 않는다. {{{+1 ìœ ë‹ˆì½”ë“œì˜ ì¸ì½”딩 ë°©ì‹ë“¤ }}} ìœ ë‹ˆì½”ë“œì˜ í‘œí˜„ ë°©ì‹ì€ ìœ ë‹ˆì½”ë“œ 컨소시엄과 ISO 10646ì— ì •ì˜ë˜ì–´ 있다. 대표ì ì¸ ì¸ì½”딩 ë°©ì‹ì€ UCS-2, UTF-8, UTF-16ì´ ìžˆë‹¤. (UTF - Unicode Transformation Format, UCS - Universal Character Set) == UCS == UCS는 ISO/IEC 10646으로 ì •ì˜ëœ ë¬¸ìž ì¸ì½”ë”©ì˜ êµì œ 표준ì´ë‹¤. UCS는 ìœ ë‹ˆì½”ë“œ ê°’ì„ ê·¸ëŒ€ë¡œ 표현하는 ì¸ì½”딩ì´ë‹¤. ìœ ë‹ˆì½”ë“œëŠ” 110만 ê°œ ì´ìƒì˜ 사용 가능한 코드 ì˜ì—ì´ ìžˆì§€ë§Œ ì¼ë°˜ì 으로 첫 65535ê°œ(Basic Multilingual Plane, BMP, 기본 다êµì–´ í‰ë©´)ë§Œì´ ì‚¬ìš©ëœë‹¤. ê·¸ë¦¬ê³ ë§Žì€ ì½”ë“œ ì˜ì—, 심지어 BMP ì˜ì—ì—ì„œë„ ì„œë¡œ 다른 ì¸ì½”딩 형태와 ë¯¸ëž˜ì˜ í™•ìž¥ì„±ì„ ê³ ë ¤í•˜ì—¬, ì¼ë¶€ëŸ¬ 문ìžë¥¼ í• ë‹¹í•˜ì§€ 않았다. UCS-2는 초기 ìœ ë‹ˆì½”ë“œ 표현 ë°©ì‹ ì¤‘ 하나로 ê° ë¬¸ìžë“¤ì„ 0 ~ 65535(0xFFFF) 사ì´ì˜ 코드 값으로 ë§¤ê²¨ë†“ê³ , ê° ë¬¸ìžë¥¼ ë‘ ë°”ì´íŠ¸ë¡œ 표현한다. BMP 코드 ì˜ì—만 í‘œí˜„í• ìˆ˜ ìžˆê³ , BMP ë°–ì˜ ì˜ì—ì€ í‘œí˜„ì´ ë¶ˆê°€ëŠ¥í•˜ë‹¤. UCS-2를 확장하여 BMP ë°–ì˜ ì˜ì—ë„ í‘œì‹œê°€ 가능하게 í•œ ì¸ì½”딩으로 UTF-16ì´ ìžˆë‹¤. UCS-4는 0xFFFFFFFF ê¹Œì§€ì˜ ì½”ë“œ 즉 4 ë°”ì´íŠ¸ë¡œ í•œ 문ìžë¥¼ 표현한다. ìœ ë‹ˆì½”ë“œ ê°’ì„ ê·¸ëŒ€ë¡œ 32비트로 표현한다. UTF-32ë„ ê°™ì€ ë°©ì‹ì„ 사용하는 ì¸ì½”딩ì´ë©° ë”°ë¼ì„œ __USC-4와 UTF-32는 같다.__ == UTF-16 == UTF-16ì€ ê¸°ë³¸ 다êµì–´ í‰ë©´(BMP)ì— í•´ë‹¹í•˜ëŠ” 문ìžë“¤ì€ 그대로 16비트 값으로 ì¸ì½”딩ëœë‹¤[[footnote(ì´ ê²½ìš° ì¸ì½”ë”©ëœ ë°”ì´íŠ¸ 스트ë§ì˜ 엔디언만 조심하면 ëœë‹¤.)]]. ê·¸ë¦¬ê³ BMPì— í¬í•¨ë˜ì§€ 않는 문ìžë“¤ì€ 특별히 ì •í•´ì§„ ë°©ì‹ìœ¼ë¡œ 32비트 ì¸ì½”딩ëœë‹¤. ê·¸ ìžì„¸í•œ ë°©ì‹ì€ 다ìŒê³¼ 같다. BMP를 벗어나는 문ìžëŠ” 서러게ì´íŠ¸(Surrogate) ë¬¸ìž ì˜ì—ì— í•´ë‹¹í•˜ëŠ” ë‘ ê°œì˜ 16비트 문ìžë¡œ 변환ë˜ì–´ í•œ ìŒ(즉 32비트)ì´ ê·¸ 문ìžë¥¼ 표현한다. ìœ ë‹ˆì½”ë“œì˜ ê¸°ë³¸ 다êµì–´ í‰ë©´ì— 문ìžê°€ ì „í˜€ ë°°ì •ë˜ì–´ 있지 ì•Šì€ ì˜ì—ì´ 2êµ°ë°ê°€ ìžˆëŠ”ë° í•˜ë‚˜ëŠ” 110110으로 시작하는 ì˜ì—으로 U+D800부터 U+DB7F까지ì´ê³ 다른 하나는 110111으로 시작하는 ì˜ì—으로 U+DC00부터 U+DFFFê¹Œì§€ì˜ ì˜ì—ì´ë‹¤. ì „ìžëŠ” High Surrogate ì˜ì—, 후ìžëŠ” Low Surrogate ì˜ì—ì´ë¼ê³ 부른다. ë”°ë¼ì„œ UTF-16ì—ì„œ 110110ì´ë‚˜ 110111ë¡œ 시작하는 경우 기본 다êµì–´ í‰ë©´ ì´ì™¸ 문ìžë¼ê³ í™•ì‹ í• ìˆ˜ ìžˆì„ ê²ƒì´ë‹¤. ë‹¤ìŒ ê°™ì€ BMP 범위를 벗어나는 문ìžê°€ 있다. {{{ Bit 31 24|23 16|15 8|7 0| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0 0 0 0 0 0 0 0|0 0 0 z z z z z|x x x x x x y y|y y y y y y y y| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ }}} 1) 가장 ì•žì—서부터 110110ì„ ë¶™ì¸ë‹¤. 2) ê·¸ ë’¤ì— z z z z zì—ì„œ 1ì„ ëº€ ZZZZì„ ë¶™ì¸ë‹¤. 3) x x x x x x 를 붙ì¸ë‹¤. 여기까지 High-Surrogateê°€ ëœë‹¤. {{{ |15 8|7 0| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1 1 0 1 1 0 Z Z|Z Z x x x x x x| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ }}} 4) 가장 ì•žì—서부터 110111ì„ ë¶™ì¸ë‹¤. 5) 나머지 y y y y y y y y y y를 붙ì¸ë‹¤. 여기가 Low-Surrogateê°€ ëœë‹¤. {{{ |15 8|7 0| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1 1 0 1 1 1 y y|y y y y y y y y| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ }}} ì´ê°™ì´ ë‘ ê°œì˜ ì„œëŸ¬ê²Œì´íŠ¸ 문ìžë¥¼ 구성하는 방법으로 U+10FFFF ê¹Œì§€ì˜ ë¬¸ìžë¥¼ ì¸ì½”ë”©í• ìˆ˜ 있다. == UTF-8 == UCS와 UTF-16ì˜ ë¬¸ì œì ì€ ì§€ë‚˜ì¹˜ê²Œ ë§Žì€ ê³µê°„ì´ í•„ìš”í•˜ë‹¤ëŠ” ì ê³¼ 기존 ASCII 체계와 í˜¸í™˜ì„±ì´ ì—†ë‹¤ëŠ” ì ì´ë‹¤. 첫 번째 ë¬¸ì œëŠ” 컴퓨터 ìƒì— 존재하는 ë§Žì€ ê¸€ìžë“¤ì´ 1ë°”ì´íŠ¸ë¡œ í‘œí˜„í• ìˆ˜ 있는 글ìžë“¤ì¸ë° ì´ ê¸€ìžë“¤ì— 2ë°”ì´íŠ¸ë¥¼ 사용하는 ê²ƒì€ ë„ˆë¬´ ë‚비ë¼ëŠ” 지ì ì´ë‹¤. ë‘ ë²ˆì§¸ ë¬¸ì œëŠ” UCS-2나 UTF-16ê³¼ í˜¸í™˜ì„±ì„ ìœ„í•´ì„œëŠ” 기존 ë¬¸ì„œë“¤ì„ ëª¨ë‘ ë³€í™˜í•´ì•¼í•˜ëŠ”ë° ì´ ì—ì‹œ ë¬¸ì œë¼ëŠ” 지ì ì´ë‹¤. ì´ ë‘ ê°€ì§€ ë¬¸ì œë¥¼ ë™ì‹œì— 해결하는 ì¸ì½”딩 ë°©ì‹ì´ UTF-8ì´ë‹¤. UTF-8ì€ ì¼„ 톰슨과 ë¡ íŒŒì´í¬ê°€ ë§Œë“ ê°€ë³€ ê¸¸ì´ ë¬¸ìž ì¸ì½”딩 ë°©ì‹ì´ë‹¤. 본래 FSS-UTF(File System Safe UCS/Unicode Transformation Format)ì´ëž€ ì´ë¦„으로 ì œì•ˆë˜ì—ˆë‹¤. UTF-8 ì¸ì½”ë”©ì€ ìœ ë‹ˆì½”ë“œ í•œ 문ìžë¥¼ 나타내기 위해 1ë°”ì´íŠ¸ì—ì„œ 4ë°”ì´íŠ¸ê¹Œì§€ë¥¼ 사용한다. U+0000부터 U+007Fë²”ìœ„ì— ìžˆëŠ” ASCII 문ìžëŠ” UTF-8ì—ì„œ 1ë°”ì´íŠ¸ 만으로 표시ëœë‹¤. 7비트 ì´ìƒì´ 필요한 글ìžë“¤ì€ ë‹¤ìŒ ë°©ì‹ìœ¼ë¡œ ë°”ì´íŠ¸ 수를 ëŠ˜ë ¤ê°„ë‹¤. {{{ U+ 0 0 0 0 0 y y y | y y x x x x x x ì˜ ê¸€ìžë“¤ì€ UTF-8 | 1 1 0 y y y y y | 1 0 x x x x x x | U+ z z z z y y y y | y y x x x x x x ì˜ ê¸€ìžë“¤ì€ UTF-8 | 1 1 1 0 z z z z | 1 0 y y y y y y | 1 0 x x x x x x | U+ 0 0 0 w w w z z | z z z z y y y y | y y x x x x x x ì˜ ê¸€ìžë“¤ì€ UTF-8 | 1 1 1 1 0 w w w | 1 0 z z z z z z | 1 0 y y y y y y | 1 0 x x x x x x | }}} 첫 ë°”ì´íŠ¸ëŠ” 110 ë˜ëŠ” 1110, 11110 으로 ì‹œìž‘í•˜ê³ , 나머지 ë°”ì´íŠ¸ëŠ” 10으로 시작한다. ê²°ê³¼ì 으로 첫 128 문ìžëŠ” 1ë°”ì´íŠ¸ë¡œ 표시ë˜ê³ , ê·¸ ë‹¤ìŒ 1920 문ìž(ë°œìŒ ê¸°í˜¸ê°€ ë¶™ì€ ë¼í‹´ 문ìž, 그리스 문ìž, 키릴 문ìž, 콥트 문ìž, 아르메니아 문ìž, 히브리 문ìž, ì•„ëž ë¬¸ìž)는 2ë°”ì´íŠ¸ë¡œ 표시ë˜ë©°, 나머지 문ìžë“¤ 중 BMP ì•ˆì— ë“¤ì–´ìžˆëŠ” ê²ƒì€ 3ë°”ì´íŠ¸, ì•„ë‹Œ ê²ƒì€ 4ë°”ì´íŠ¸ë¡œ 표시ëœë‹¤. 위 íŒ¨í„´ì„ ì‚¬ìš©í•˜ë©´ ë” í° ì½”ë“œ ë²”ìœ„ë„ í‘œì‹œí• ìˆ˜ë„ ìžˆë‹¤. 하지만 ì›ëž˜ UTF-8ì€ 6ë°”ì´íŠ¸ê¹Œì§€ì˜ 코드 ë²”ìœ„ë„ í‘œí˜„í• ìˆ˜ 있었으나, 2003ë…„ 11ì›” RFC 3629ì—ì„œ UTF-16으로 표현 가능한 ìƒí•œì„ ì¸ U+10FFFF ê¹Œì§€ì˜ ê¸€ìžë§Œ í‘œì‹œí• ìˆ˜ 있ë„ë¡ ì œí•œí•˜ê²Œ ë˜ì—ˆë‹¤. == ìœ ë‹ˆì½”ë“œ ì •ê·œí™” == === 개요 === ìœ ë‹ˆì½”ë“œ ì •ê·œí™”(Unicode normalization ë˜ëŠ” Unicode equivalence)는 ëª¨ì–‘ì´ ê°™ì€ ë¬¸ìžê°€ 여러 ê°œ ìžˆì„ ê²½ìš°, ì´ë¥¼ ê¸°ì¤€ì— ë”°ë¼ í•˜ë‚˜ë¡œ 통합해주는 ì¼ì„ 가리킨다. 예를 들어 ìœ ë‹ˆì½”ë“œëŠ” 미리 í•©ì³ì§„(precomposed) 문ìžì™€ ë”°ë¡œ 결합하는(combining) 문ìžê°€ ê³µì¡´í•˜ê³ ìžˆë‹¤(예: 한글 ìžëª¨ ì˜ì— [ã…Žã…ã„´]ê³¼ 한글 ìŒì ˆ ì˜ì— [í•œ]). ê·¸ë¦¬ê³ ê° ë‚˜ë¼ ë§ˆë‹¤ ê°™ì€ í•œìžì— 다른 코드 ê°’ì„ ê°€ì§€ê³ ìžˆë‹¤(예: í•œêµì–´ 亮 U+F977, CJKV 통합 í•œìž äº® U+4EAE). ì´ë“¤ì„ ì ì ˆí•œ 방법으로 ì •ê·œí™”í•˜ì§€ 않으면 여러가지 ë¬¸ì œê°€ ìƒê²¨ë‚ 수 있다. ìœ ë‹ˆì½”ë“œ ì •ê·œí™” ìƒì„¸ 스펙 http://www.unicode.org/reports/tr15/ === ì •ê·œí™” 형태 Normalization Forms (NF) === || Form || Description || || Normalization Form D (NFD) || ì •ì¤€ 분해 Canonical Decomposition || || Normalization Form C (NFC) || ì •ì¤€ 분해한 ë’¤ì—, 다시 ì •ì¤€ ê²°í•© Canonical Decomposition, followed by Canonical Composition || || Normalization Form KD (NFKD) || 호환 분해 Compatibility Decomposition || || Normalization Form KC (NFKC) || 호환 분해한 ë’¤, 다시 ì •ì¤€ ê²°í•© Compatibility Decomposition, followed by Canonical Composition || ==== NFD ==== 코드를 ì •ì¤€ 분해한다. * ë°œìŒ êµ¬ë³„ 기호가 ë¶™ì€ ê¸€ìžê°€ 하나로 처리ë˜ì–´ ìžˆì„ ê²½ìš°, ì´ë¥¼ 기호별로 나눈다. * í•œê¸€ì„ í•œê¸€ ìŒì ˆ ì˜ì—(U+AC00~U+D7A3)으로 ì¼ì„ 경우, ì´ë¥¼ 첫가ë 코드로 나눈다. * 표준과 다른 ì¡°í•© 순서를 ì œëŒ€ë¡œ ì •ë ¬í•œë‹¤. 예) * À (U+00C0) → A (U+0041) + Ì€ (U+0300) * 위 (U+C704) → á„‹ (U+110B) + á…± (U+1171) ==== NFC ==== 코드를 ì •ì¤€ 분해한 ë’¤ì—, 다시 ì •ì¤€ 결합한다. * ë°œìŒ êµ¬ë³„ 기호가 ë¶™ì—ˆì„ ê²½ìš°, ì´ë¥¼ 코드 하나로 처리한다. * í•œê¸€ì„ ì²«ê°€ë 코드로 ì¼ì„ 경우, ì´ë¥¼ 한글 ìŒì ˆ ì˜ì—(U+AC00~U+D7A3)으로 처리한다. 예) * A (U+0041) + Ì€ (U+0300) → À (U+00C0) * á„‹ (U+110B) + á…± (U+1171) → 위 (U+C704) ==== NFKD ==== 코드를 호환 분해한다. * í•©ìž ì²˜ë¦¬ëœ ì•ŒíŒŒë²³ 코드를 ê° ì•ŒíŒŒë²³ìœ¼ë¡œ 분해한다. * 옛 ì•ŒíŒŒë²³ì„ í˜„ëŒ€ 알파벳으로 바꾼다. 예) * ï¬ (U+FB01) → f (U+0066) + i (U+0069) ==== NFKC ==== 코드를 호환 분해한 ë’¤ì— ë‹¤ì‹œ ì •ì¤€ 결합한다. * ë°œìŒ êµ¬ë³„ 기호가 있는 옛 ì•ŒíŒŒë²³ì„ í˜„ëŒ€ 알파벳으로 바꾼다. 예) * ẛ (U+1E9B) → ṡ (U+1E61) ==== ëª¨ë“ ê¸°ì¤€ì—ì„œ ê³µí†µëœ ì •ê·œí™” 처리 ==== * í•œì¤‘ì¼ í˜¸í™˜ í•œìžë¥¼ 한중ì¼ì›” 통합 í•œìžë¡œ 처리한다. * ì „ìš© 기호를 ëª¨ì–‘ì´ ê°™ì€ ë³´íŽ¸ì ì¸ ê¸°í˜¸ë¡œ 바꾼다. 예) * 樂 (U+F914), 樂 (U+F95C), 樂 (U+F9BF) → 樂 (U+6A02) * Ω (U+2126, 옴) → Ω (U+03A9, 오메가) ==== 요약 ==== 1. NFD, NFKD를 ê±°ì³ì„œ 최대한 분해한다. 2. 가능한 ëª¨ë“ ë¹„ê²°í•© 문ìžì™€ ë’¤ì— ë”°ë¼ ì˜¤ëŠ” ê²°í•© 문ìž, ê·¸ë¦¬ê³ ê·¸ ë’¤ì— ë”°ë¼ì˜¤ëŠ” 비결합 문ìžì— 대해 순서대로 ê²°í•©ì„ ì‹œë„한다. 3. ê²°í•©ì´ ì„±ê³µí•˜ë©´ ë’¤ì˜ ë¬¸ìžëŠ” ì§€ìš°ê³ ì•žì˜ ë¬¸ìžë¥¼ ê²°í•©ëœ ë¬¸ìžë¡œ 바꾼다. ì´ì „ì— ì‹¤íŒ¨í•œ ê²°í•©ì€ ë‹¤ì‹œ ì‹œë„하지 않는다. 4. ê²°í•©ì„ ì‹œë„í• ë•ŒëŠ” ì¼ë°˜ 분해 ë§¤í•‘ì˜ ì—변환만 ì‹œë„한다(ì˜ˆì™¸ë„ ìžˆë‹¤.). === ê° ì–¸ì–´ì˜ ì •ê·œí™” 방법 === ==== Java ==== {{{#!gcode import java.text.Normalizer; public class NormalizerTest { public static void main(String args[]) { String ui = "위"; String nfd = Normalizer.normalize(ui, Normalizer.Form.NFD); String nfc = Normalizer.normalize(nfc, Normalizer.Form.NFC); } } => ui = U+C704 => nfd = U+110B + U+1171 => nfc = U+C704 }}} ==== Perl ==== {{{#!gcode #!/usr/bin/perl use utf8; use Unicode::Normalize; my $ui = "위"; my $nfd = NFD("위"); my $nfc = NFC($nfd); }}} ==== C# ==== {{{#!gcode using System; using System.Text; string s1 = new String( new char[] { '\uC704' } string s2 = null; s1.IsNormalized(); s1.IsNormalized(NormalizationForm.FormD)); // False // False // Normalize to the default form(Form C) s2 = s1.Normalize(); s2.IsNormalized(); // True // Normalize to Form D s2 = s1.Normalize(NormalizationForm.FormD); s2.IsNormalized(NormalizationForm.FormD)); // True }}} ==== C++ ==== {{{#!gcode const int maxIterations = 10; LPWSTR strInput = L"위"; LPWSTR strResult = NULL; HANDLE hHeap = GetProcessHeap(); int iSizeEstimated = NormalizeString(NormalizationD, strInput, -1, NULL, 0); for (int i = 0; i < maxIterations; i++) { if (strResult) HeapFree(hHeap, 0, strResult); strResult = (LPWSTR)HeapAlloc(hHeap, 0, iSizeEstimated * sizeof (WCHAR)); iSizeEstimated = NormalizeString(NormalizationD, strInput, -1, strResult, iSizeEstimated); if (iSizeEstimated > 0) break; // success } TRACE(L"%x", strInput[0]); TRACE(L"%x", strResult[0]); TRACE(L"%x", strResult[1]); => strInput = U+C704 => strResult = U+110B + U+1171 }}} Windows Vista >= only https://msdn.microsoft.com/en-us/library/windows/desktop/dd319093(v=vs.85).aspx == BOM == ë°”ì´íŠ¸ 순서 í‘œì‹(Byte Order Mark, BOM)ì€ ìœ ë‹ˆì½”ë“œì—ì„œ ì—”ë””ì–¸ì„ êµ¬ë³„í•˜ê¸° 위해 사용ë˜ëŠ” 문ìžë¡œ, ë¬¸ìž ê°’ì€ U+FEFF ì´ë‹¤. ìœ ë‹ˆì½”ë“œ ì¸ì½”딩ì—ì„œ ë¬¸ì œê°€ ë˜ëŠ” ê²ƒì€ ë°”ì´íŠ¸ 순서 ë˜ëŠ” 엔디언ì´ë‹¤. 즉 'A'를 00 48ë¡œ í‘œí˜„í• ê²ƒì¸ê°€ 48 00으로 í‘œí˜„í• ê²ƒì¸ê°€? UTF-16, UTF-32 ê°™ì€ ì¸ì½”딩ì—서는 ì—”ë””ì–¸ì˜ ì¢…ë¥˜ì— ë”°ë¼ ë¬¸ìžì—´ì˜ ê°’ì´ ì™„ì „ížˆ 달ë¼ì§€ë¯€ë¡œ, 문ìžì—´ì˜ ì—”ë””ì–¸ì„ êµ¬ë³„í• ìˆ˜ 있는 í‘œì‹ì´ 필요하다. ì´ì— ë”°ë¼ ìœ ë‹ˆì½”ë“œ 문ìžì—´ ì•žì— BOM 문ìžë¥¼ 붙여, ì—”ë””ì–¸ì„ êµ¬ë³„í•œë‹¤. UTF-8ì˜ ê²½ìš°ì—는 엔디언 ë¬¸ì œê°€ ì¼ì–´ë‚˜ì§€ 않으므로 BOMì„ ë¶™ì—¬ì•¼ í• í•„ìš”ëŠ” 없다. 하지만 해당 ìžë£Œê°€ UTF-8 ì¸ì½”딩ì´ë¼ëŠ” í‘œì‹ìœ¼ë¡œ 사용하는 ê²½ìš°ë„ ìžˆë‹¤. 특히 마ì´í¬ë¡œì†Œí”„íŠ¸ì˜ ë§Žì€ ë¬¸ì„œ 편집기는 UTF-8 ë¡œ ì €ìž¥í• ê²½ìš° ìžë™ìœ¼ë¡œ ë¬¸ì„œì˜ ê°€ìž¥ ì•žë¶€ë¶„ì— BOMì„ ì¶”ê°€í•œë‹¤. ì´ì™€ëŠ” 반대로 ìœ ë‹‰ìŠ¤ 계열 문서 편집기는 BOMì„ ì‚¬ìš©í•˜ì§€ 않는 경우가 보통ì´ë‹¤. ì´ ê²½ìš° ë¬¸ì„œì˜ BOMì„ ìž˜ëª» ì¸ì‹í•˜ê³ ë¬¸ì œê°€ ë°œìƒí• ìˆ˜ë„ ìžˆë‹¤. ê° ìœ ë‹ˆì½”ë“œ ì¸ì½”딩 ë°©ë²•ì— ë”°ë¥¸ BOM ê°’ì€ ë‹¤ìŒê³¼ 같다. ||||||'''BOM Table'''|| ||<td style="background-color:#f8f8f8">Encoding||<td style="background-color:#f8f8f8">Representation|| ||UTF-8||EF BB BF|| ||UTF-16 ë¹… 엔디언||FE FF|| ||UTF-16 리틀 엔디언||FF FE|| ||UTF-32 ë¹… 엔디언||00 00 FE FF|| ||UTF-32 리틀 엔디언||FF FE 00 00|| ||SCSU||0E FE FF|| ||UTF-EBCDIC||DD 73 66 73|| ||BOCU-1||FB EE 28|| 참조 ---- http://ko.wikipedia.org/wiki/UTF-8 http://ko.wikipedia.org/wiki/UTF-16 http://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8_%EC%88%9C%EC%84%9C_%ED%91%9C%EC%8B%9D http://heyjimin.tistory.com/15 ---- CategoryDocument