유니코드 홈페이지 (영어)
Unicode(유니코드)
1 개요
전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식. 주요 구성 요소는 ISO/IEC 10646 Universal Character Set과 UCS, UTF 등의 인코딩 방식, 문자 처리 알고리즘 등이다. 전 세계의 모든 문자를 담는 ISO/IEC 10646 코드표를 사용함으로써, 각 언어와 문자 체계에 따른 충돌 문제를 해결하였다. 따라서 유니코드를 사용하면 한글과 신자체·간체자, 아랍 문자 등을 통일된 환경에서 깨뜨리지 않고 사용할 수 있다.
초창기에는 문자 코드는 ASCII의 로마자 위주 코드였고, 1바이트의 남은 공간에 각 나라가 자국 문자를 할당하였었다. 하지만 이런 상황에서 다른 국가에 이메일을 보냈더니 글자가 와장창 깨졌던 것(...) 인터넷 웹페이지도 마찬가지였다. 이에 따라 2바이트의 넉넉한 공간에 세상의 모든 문자를 할당한 결과물이 이것이다. 다만 로마자(혹은 프로그래밍, url 등의 통신 포함) 입장에서는 용량이 두배가 되어 이래저래 비효율인 셈이 되었고, 가변길이 문자 인코딩(UTF-8)을 도입해서 기존 ASCII와 호환되는 규격도 도입했다. 흔히 우리가 웹 브라우저의 인코딩을 설정하면서 자주 보는 UTF-8이라는 말이 이것이고, 바로 유니코드에 기반한 인코딩 방식 중 하나를 가리키는 것이다.
현재의 유니코드는 지구상에서 통용되는 대부분의 문자들을 담고 있다. 여기에는 언어를 표기할 때 쓰는 문자는 물론, 악보 기호, 이모티콘 ʕ•ᴥ•ʔ, 태그, 마작이나 도미노 기호, પ નુલુંગ લસશ니 엉덩이 더러워, ℳα℘ίɕ 같은 것들도 포함된다. 다만 모든 문자 체계를 담고 있는 것은 아니라서, 서하 문자처럼 과거에 사용된 문자 체계나 자료가 많이 남아 있지 않은 문자 체계는 등록이 되어있지 않아 유니코드로 표현할 수 없다. 물론 아직 유니코드에 없다 뿐이지 어지간한 문자 체계는 유니코드에 집어 넣으려는 계획이 진행중이다. 앞으로 유니코드에 뭘 넣을지 보여 주는 로드맵이 있는데 꽉 차 있다. 선형문자 A는 해독도 안 되었는데 들어가 있다 ~~170번부터 18A까지 서하 문자가 보인다.
키보드에 없는 유니코드 문자를 입력하는 다양한 방법이 있다.
잘 알아두면 유니코드 문자를 입력하지 못해 籾 대신 "米+刃", 畠 대신 "白밑에田", 栃 대신 "又대신 万이 들어간 板" 같이 표현하는 안쓰러운 일을 피할 수 있다.[1]
2 역사
유니코드는 1991년 10월에 최초 버전(1.0.0)이 발표됐으며, 2015년 6월 현재 최신 버전은 2016년 6월에 발표된 9.0이다. 자세한 것은 영어 위키백과의 Unicode#Versions 참고.
3 표기 관례
유니코드 문자의 경우 해당 글자의 코드를 표기할 때 U+(16진수 숫자)[2]라고 쓴다. 예를 들면 한글 '가' 자는 유니코드에서 16진수로 AC00(10진수의 44032)라는 코드 넘버를 가지는데, 이것을 U+AC00이라고 적는 식이다.
문자 표기 관례는 아니지만 16진수 표기의 관례를 따라 0x 를 붙여 0xAC00라고 표기된 경우도 간혹 있으니 참고하면 좋다. 레지스트리 편집 등의 컴퓨터에서의 수 표현 영역으로 넘어가면 AC 00 이라 적힌 것을 볼 수 있고, Endian에 따라 00 AC로 적히기도 한다.
4 유니코드 테이블
4.1 유니코드의 구조
유니코드 문자 집합의 문자 평면 | |||||||||
기본 | 보조 | ||||||||
Plane 0 0000 ~ FFFF | Plane 1 10000 ~ 1FFFF | Plane 2 20000 ~ 2FFFF | Planes 3–13 30000 ~ 3FFFF | Plane 14 E0000 ~ EFFFF | Planes 15–16 F0000 ~ 10FFFF | ||||
기본 다국어 평면 BMP | 보조 다국어 평면 SMP | 보조 표의문자 평면 SIP | 3차 표의문자 평면 TIP | 보조 특수 목적 평면 SSP | 사용자 자유 영역 PUA | ||||
0XXX | 8XXX | 10XXX | 18XXX | 20XXX | 28XXX | 문자 없음 | E0XXX | 15: PUA-A | |
1XXX | 9XXX | 11XXX | 19XXX | 21XXX | 29XXX | F0000–FFFFF | |||
2XXX | AXXX | 12XXX | 1AXXX | 22XXX | 2AXXX | ||||
3XXX | BXXX | 13XXX | 1BXXX | 23XXX | 2BXXX | 16: PUA-B | |||
4XXX | CXXX | 14XXX | 1CXXX | 24XXX | 2CXXX | 100000–10FFFF | |||
5XXX | DXXX | 15XXX | 1DXXX | 25XXX | 2DXXX | ||||
6XXX | EXXX | 16XXX | 1EXXX | 26XXX | 2EXXX | ||||
7XXX | FXXX | 17XXX | 1FXXX | 27XXX | 2FXXX |
유니코드는 대개 기본 문자가 들어 있는 BMP(Basic multilingual plane), BMP에 없는 옛글자 등을 넣는 SMP(Supplementary Multilingual Plane), 한자를 더 넣기 위해 별도로 정의한 SIP(Supplementary Ideographic Plane), 앞의 영역에 포함되지 않는 기타 문자 등이 들어가는 SSP(Supplementary Special-purpose Plane), 자유 영역인 PUA(Private Use Area) 등이 정의되어 있다.[3]
자세한 구조는 다음 표와 같다.[4] 아래 표에 나온 번역명은 결코 공식적이지 않고 공신력이 없다. 어디까지나 '가능한 번역' 중의 하나이며 오역도 있을 수 있다. 아래의 번역명들은 단지 편의를 위해 제공하는 것뿐이며, 따라서 아래의 번역명들을 공식 번역처럼 사용하는 것은 권장되지 않는다. 그러므로 원어명을 같이 기재한다.
'한중일 통합 한자'는 정확히 말하면 '한중일월 통합 한자'라고 해야 맞다. 유니코드의 '한중일 통합 한자'에는 근대 이전에 베트남어의 고유어를 표기하기 위해 사용하던 쯔놈 글자들도 섞여 있기 때문이다. 그런데 이미 유니코드 초창기(1.0)부터 CJK Unified Ideograph(s)로 불렀고(당시에는 한국, 중국, 대만, 일본의 표준 문자 코드만을 고려했고, 쯔놈은 상대적으로 나중에 추가됐다), 영역 이름과 문자 이름은 한 번 정해지면 절대로 고칠 수 없기 때문에 이를 CJKV로 고치기에는 이미 너무 늦었다.
평면 | 코드 영역 | 글자 수 | 해당하는 문자 | UTF-8 바이트 수 |
BMP | U+0000 ~ U+007F | 128자 | 제어 문자와 라틴 기본[5][6] C0 Controls and Basic Latin | 1 |
U+0080 ~ U+00FF | 128자 | 제어 문자와 라틴 보충 C1 Controls and Latin-1 Supplement | 2 | |
U+0100 ~ U+017F | 128자 | 라틴 확장-A Latin Extended-A | ||
U+0180 ~ U+024F | 208자 | 라틴 확장-B Latin Extended-B | ||
U+0250 ~ U+02AF | 96자 | 국제 음성 기호 확장 IPA Extensions | ||
U+02B0 ~ U+02FF | 80자 | 조정 문자 Spacing Modifier Letters | ||
U+0300 ~ U+036F | 112자 | 조합 분음 기호 Combining Diacritical Marks | ||
U+0370 ~ U+03FF | 144자 | 그리스어와 콥트어 Greek and Coptic | ||
U+0400 ~ U+04FF | 256자 | 키릴 자모 Cyrillic | ||
U+0500 ~ U+052F | 48자 | 키릴 자모 보충 Cyrillic Supplement | ||
U+0530 ~ U+058F | 96자 | 아르메니아어 Armenian | ||
U+0590 ~ U+05FF | 112자 | 히브리어 Hebrew | ||
U+0600 ~ U+06FF | 256자 | 아랍어 Arabic | ||
U+0700 ~ U+074F | 80자 | 시리아어 Syriac | ||
U+0750 ~ U+077F | 48자 | 아랍어 보충 Arabic Supplement | ||
U+0780 ~ U+07BF | 64자 | 타나 문자 Thaana | ||
U+07C0 ~ U+07FF | 64자 | 은코 문자 N'Ko | ||
U+0800 ~ U+083F | 64자 | 사마리아 문자 Samaritan | 3 | |
U+0840 ~ U+085F | 32자 | 만다이어 Mandaic | ||
U+08A0 ~ U+08FF | 96자 | 아랍어 확장-A Arabic Extended-A | ||
U+0900 ~ U+097F | 128자 | 데바나가리 Devanagari | ||
U+0980 ~ U+09FF | 128자 | 벵골어 Bengali | ||
U+0A00 ~ U+0A7F | 128자 | 구르무키 문자 Gurmukhi | ||
U+0A80 ~ U+0AFF | 128자 | 구자라트어 Gujarati | ||
U+0B00 ~ U+0B7F | 128자 | 오리야어 Oriya | ||
U+0B80 ~ U+0BFF | 128자 | 타밀어 Tamil | ||
U+0C00 ~ U+0C7F | 128자 | 텔루구어 Telugu | ||
U+0C80 ~ U+0CFF | 128자 | 칸나다어 Kannada | ||
U+0D00 ~ U+0D7F | 128자 | 말라얄람어 Malayalam | ||
U+0D80 ~ U+0DFF | 128자 | 싱할라어 Sinhala | ||
U+0E00 ~ U+0E7F | 128자 | 타이어 Thai | ||
U+0E80 ~ U+0EFF | 128자 | 라오어 Lao | ||
U+0F00 ~ U+0FFF | 256자 | 티베트어 Tibetan | ||
U+1000 ~ U+109F | 160자 | 미얀마어 Myanmar | ||
U+10A0 ~ U+10FF | 96자 | 조지아어 Georgian | ||
U+1100 ~ U+11FF | 256자 | 한글 자모[7] Hangul Jamo | ||
U+1200 ~ U+137F | 384자 | 에티오피아어 Ethiopic | ||
U+1380 ~ U+139F | 32자 | 에티오피아어 보충 Ethiopic Supplement | ||
U+13A0 ~ U+13FF | 96자 | 체로키어 Cherokee | ||
U+1400 ~ U+167F | 640자 | 통합 캐나다 원주민 소리 마디 Unified Canadian Aboriginal Syllabics | ||
U+1680 ~ U+169F | 32자 | 오검 문자 Ogham | ||
U+16A0 ~ U+16FF | 96자 | 룬 문자 Runic | ||
U+1700 ~ U+171F | 32자 | 타갈로그어 Tagalog | ||
U+1720 ~ U+173F | 32자 | 하누누어 Hanunoo | ||
U+1740 ~ U+175F | 32자 | 부히드어 Buhid | ||
U+1760 ~ U+177F | 32자 | 타그반와어 Tagbanwa | ||
U+1780 ~ U+17FF | 128자 | 크메르어(캄보디아어) Khmer | ||
U+1800 ~ U+18AF | 176자 | 몽골어 Mongolian | ||
U+1900 ~ U+194F | 80자 | 림부 Limbu | ||
U+1950 ~ U+197F | 48자 | 타이 레 문자 Tai Le | ||
U+1980 ~ U+19DF | 96자 | 새 타이 루에 Tai Lue | ||
U+19E0 ~ U+19FF | 32자 | 크메르 기호 Khmer Symbols | ||
U+1A00 ~ U+1A1F | 32자 | 부기 문자 Buginese | ||
U+1A20 ~ U+1AAF | 144자 | 란나 문자 Tai Tham | ||
U+1B00 ~ U+1B7F | 128자 | 발리 문자 Balinese | ||
U+1B80 ~ U+1BBF | 64자 | 순다어 Sundanese | ||
U+1BC0 ~ U+1BFF | 64자 | 바타크어 Batak | ||
U+1C00 ~ U+1C4F | 80자 | 렙차어 Lepcha | ||
U+1C50 ~ U+1C7F | 48자 | 올치키 문자 Ol Chiki | ||
U+1CC0 ~ U+1CCF | 16자 | 순다어 보충 Sundanese Supplement | ||
U+1CD0 ~ U+1CFF | 48자 | 베다어 확장 Vedic Extensions | ||
U+1D00 ~ U+1D7F | 128자 | 음성 부호 확장 Phonetic Extensions | ||
U+1D80 ~ U+1DBF | 64자 | 음성 부호 확장 보충 Phonetic Extensions Supplement | ||
U+1DC0 ~ U+1DFF | 64자 | 조합 분음 부호 보충 Combining Diacritical Marks Supplement | ||
U+1E00 ~ U+1EFF | 256자 | 라틴 문자 추가 확장 Latin extended additional | ||
U+1F00 ~ U+1FFF | 256자 | 그리스어 확장 Greek Extended | ||
U+2000 ~ U+206F | 112자 | 일반 구두점 General Punctuation | ||
U+2070 ~ U+209F | 48자 | 위 첨자와 아래 첨자 Superscripts and Subscripts | ||
U+20A0 ~ U+20CF | 48자 | 화폐 기호 Currency Symbols | ||
U+20D0 ~ U+20FF | 48자 | 조합 분음 부호(기호) Combining Diacritical Marks for Symbols | ||
U+2100 ~ U+214F | 80자 | 글자를 변형한 기호 Letterlike Symbols | ||
U+2150 ~ U+218F | 64자 | 여러 가지 수 Number Forms | ||
U+2190 ~ U+21FF | 112자 | 화살표 Arrows | ||
U+2200 ~ U+22FF | 256자 | 수학 연산자 Mathematical Operators | ||
U+2300 ~ U+23FF | 256자 | 여러 가지 기술 기호 Miscellaneous Technical | ||
U+2400 ~ U+243F | 64자 | 제어 문자 기호 Control Pictures | ||
U+2440 ~ U+245F | 32자 | 문자 인식(OCR) 기호 Optical Character Recognition | ||
U+2460 ~ U+24FF | 160자 | 괄호 문자 Enclosed Alphanumerics | ||
U+2500 ~ U+257F | 128자 | 상자 그리기 기호 Box Drawing | ||
U+2580 ~ U+259F | 32자 | 네모 기호 Block Elements | ||
U+25A0 ~ U+25FF | 96자 | 도형 기호 Geometric Shapes | ||
U+2600 ~ U+26FF | 256자 | 여러 가지 기호 Miscellaneous Symbols | ||
U+2700 ~ U+27BF | 192자 | 딩뱃 기호 Dingbats | ||
U+27C0 ~ U+27EF | 48자 | 여러 가지 수학 기호-A Miscellaneous Mathematical Symbols-A | ||
U+27F0 ~ U+27FF | 16자 | 화살표 보충-A Supplemental Arrows-A | ||
U+2800 ~ U+28FF | 256자 | 점자 Braille Patterns | ||
U+2900 ~ U+297F | 128자 | 화살표 보충-B Supplemental Arrows-B | ||
U+2980 ~ U+29FF | 128자 | 여러 가지 수학 기호-B Miscellaneous Mathematical Symbols-B | ||
U+2A00 ~ U+2AFF | 256자 | 수학 연산자 보충 Supplemental Mathematical Operators | ||
U+2B00 ~ U+2BFF | 256자 | 여러 가지 기호와 화살표 Miscellaneous Symbols and Arrows | ||
U+2C00 ~ U+2C5F | 96자 | 글라골 문자 Glagolitic | ||
U+2C60 ~ U+2C7F | 32자 | 라틴 확장-C Latin Extended-C | ||
U+2C80 ~ U+2CFF | 128자 | 콥트어 Coptic | ||
U+2D00 ~ U+2D2F | 48자 | 조지아어 보충 Georgian Supplement | ||
U+2D30 ~ U+2D7F | 80자 | 티피나그 Tifinagh | ||
U+2D80 ~ U+2DDF | 96자 | 에티오피아어 보충 Ethiopic Extended | ||
U+2DE0 ~ U+2DFF | 32자 | 키릴 자모 확장-A Cyrillic Extended-A | ||
U+2E00 ~ U+2E7F | 128 | 구두점 보충 Supplemental Punctuation | ||
U+2E80 ~ U+2EFF | 128자 | 한중일 부수 보충 CJK Radicals | ||
U+2F00 ~ U+2FDF | 224자 | 강희자전 부수 Kangxi Radicals | ||
U+2FF0 ~ U+2FFF | 16자 | 한자 생김꼴 지시 부호 Ideographic Description Characters | ||
U+3000 ~ U+303F | 64자 | 한중일 기호 및 구두점 CJK Symbols and Punctuation | ||
U+3040 ~ U+309F | 96자 | 히라가나 Hiragana | ||
U+30A0 ~ U+30FF | 96자 | 가타카나 Katakana | ||
U+3100 ~ U+312F | 48자 | 주음부호 Bopomofo | ||
U+3130 ~ U+318F | 96자 | 호환용 한글 자모 Hangul Compatibility Jamo | ||
U+3190 ~ U+319F | 16자 | 훈독 순서 지시 부호 Kanbun | ||
U+31A0 ~ U+31BF | 32자 | 주음 부호 확장 Bopomofo Extended | ||
U+31C0 ~ U+31EF | 48자 | 한중일 한자 획 CJK Strokes | ||
U+31F0 ~ U+31FF | 16자 | 가타카나 음성 확장 Katakana Phonetic Extensions | ||
U+3200 ~ U+32FF | 256자 | 한중일 괄호 문자 Enclosed CJK Letters and Months | ||
U+3300 ~ U+33FF | 256자 | 한중일 호환용 CJK Compatibility | ||
U+3400 ~ U+4DBF | 6,592자 | 한중일 통합 한자 확장-A CJK Unified Ideographs Extension-A | ||
U+4DC0 ~ U+4DFF | 64자 | 역경 6줄 기호 Yijing Hexagram Symbols | ||
U+4E00 ~ U+9FD5[8] | 20,950자 | 한중일 통합 한자 CJK Unified Ideographs | ||
U+A000 ~ U+A48F | 1,168자 | 이(Yi) 소리 마디 Yi Syllables | ||
U+A490 ~ U+A4CF | 64자 | 이(Yi) 부수 Yi Radicals | ||
U+A4D0 ~ U+A4FF | 48자 | 프레이저 문자 Lisu | ||
U+A500 ~ U+A63F | 320자 | 바이어 Vai | ||
U+A640 ~ U+A69F | 96자 | 키릴 자모 확장-B Cyrillic Extended-B | ||
U+A6A0 ~ U+A6FF | 96자 | 바뭄 문자 Bamum | ||
U+A700 ~ U+A71F | 32자 | 어조 조정 문자 Modifier Tone Letters | ||
U+A720 ~ U+A7FF | 224자 | 라틴 확장-D Latin Extended-D | ||
U+A800 ~ U+A82F | 48자 | 실헤티 나가리 Syloti Nagri | ||
U+A830 ~ U+A83F | 16자 | 인도 숫자 Common Indic Number Forms | ||
U+A840 ~ U+A87F | 64자 | 파스파 문자 Phags-pa | ||
U+A880 ~ U+A8DF | 96자 | 사우라슈트라 문자 Saurashtra | ||
U+A8E0 ~ U+A8FF | 32자 | 데바나가리 확장 Devanagari Extended | ||
U+A900 ~ U+A92F | 48자 | 카야리 문자 Kayah Li | ||
U+A930 ~ U+A95F | 48자 | 레장 문자 Rejang | ||
U+A960 ~ U+A97F | 32자 | 한글 자모 확장-A Hangul Jamo Extended-A | ||
U+A980 ~ U+A9DF | 96자 | 자바어 Javanese | ||
U+A9E0 ~ U+A9FF | 32자 | 미얀마어 확장-B Myanmar Extended-B | ||
U+AA00 ~ U+AA5F | 96자 | 참어 Cham | ||
U+AA60 ~ U+AA7F | 32자 | 미얀마어 확장-A Myanmar Extended-A | ||
U+AA80 ~ U+AADF | 96자 | 타이담어 Tai Viet | ||
U+AAE0 ~ U+AAFF | 32자 | 마니푸르어 확장 Meetei Mayek Extensions | ||
U+AB00 ~ U+AB2F | 48자 | 에티오피아어 확장-A Ethiopic Extended-A | ||
U+AB30 ~ U+AB7F | 64자 | 라틴 확장-E Latin Extended-E | ||
U+AB80 ~ U+ABBF | (64) | 미지정 영역 Not Assigned | ||
U+ABC0 ~ U+ABFF | 64자 | 마니푸르어 Meetei Mayek | ||
U+AC00 ~ U+D7AF | 11,184자[9] | 한글 글자 마디 Hangul Syllables | ||
U+D7B0 ~ U+D7FF | 80자 | 한글 자모 확장-B Hangul Jamo Extended-B | ||
U+D800 ~ U+DB7F | 896자 | 상위 대체 영역 High Surrogates | ||
U+DB80 ~ U+DBFF | 128자 | 상위 대체 사용자 영역 High Private Use Surrogates | ||
U+DC00 ~ U+DFFF | 1,024자 | 하위 대체 영역 Low Surrogates | ||
U+E000 ~ U+F8FF | 6,400자 | 사용자 영역[10] Private Use Area | ||
U+F900 ~ U+FAFF | 512자 | 한중일 호환용 한자 CJK Compatibility Ideographs | ||
U+FB00 ~ U+FB4F | 80자 | 영문 표현꼴 Alphabetic Presentation Forms | ||
U+FB50 ~ U+FDFF | 688자 | 아랍어 표현꼴-A Arabic Presentation Forms-A | ||
U+FE00 ~ U+FE0F | 16자 | 모양 구별 문자 Variation Selectors | ||
U+FE10 ~ U+FE1F | 16자 | 세로쓰기 모양 Vertical Forms | ||
U+FE20 ~ U+FE2F | 16자 | 조합용 반쪽 기호 Combining Half Marks | ||
U+FE30 ~ U+FE4F | 32자 | 한중일 호환용 꼴 CJK Compatibility Forms | ||
U+FE50 ~ U+FE6F | 32자 | 작은꼴 변형 Small Form Variants | ||
U+FE70 ~ U+FEFF | 144자 | 아랍어 표현꼴-B Arabic Presentation Forms-B | ||
U+FF00 ~ U+FFEF | 240자 | 전각/반각 모양 Halfwidth and Fullwidth Forms | ||
U+FFF0 ~ U+FFFF | 16자 | 특수 제어 문자 Specials | ||
SMP | U+10000 ~ U+1007F | 128자 | 선상 B 음절 문자 Linear B Syllabary | 4 |
U+10080 ~ U+100FF | 128자 | 선상 B 상형 문자 Linear B Ideograms | ||
U+10100 ~ U+1013F | 64자 | 에게 숫자 Aegean Numbers | ||
U+10140 ~ U+1018F | 80자 | 옛 그리스 숫자 Ancient Greek Numbers | ||
U+10190 ~ U+101CF | 64자 | 옛 기호 Ancient Symbols | ||
U+101D0 ~ U+101FF | 48자 | 파에스토스 원반 상형 문자 Phaistos Disc | ||
U+10280 ~ U+1029F | 32자 | 리키아 문자 Lycian | ||
U+102A0 ~ U+10DFF | 64자 | 카리아어 Carian | ||
U+10300 ~ U+1032F | 48자 | 옛 이탈리아 문자 Old Italic | ||
U+10330 ~ U+1034F | 32자 | 옛 고딕체 알파벳 Gothic | ||
U+10380 ~ U+1039F | 32자 | 우가리트 문자 Ugaritic | ||
U+103A0 ~ U+103DF | 64자 | 옛 페르시아 문자 Old Persian | ||
U+10400 ~ U+1044F | 80자 | 데저렛 문자 Deseret | ||
U+10450 ~ U+1047F | 48자 | 샤우 문자 Shavian | ||
U+10480 ~ U+104AF | 48자 | 오스마니아 문자 Osmanya | ||
U+10800 ~ U+1083F | 64자 | 키프로스 음절 문자 Cypriot Syllabary | ||
U+10840 ~ U+1085F | 32자 | 아람어 Imperial Aramaic | ||
U+10900 ~ U+1091F | 32자 | 페니키아 문자 Phoenician | ||
U+10920 ~ U+1093F | 32자 | 리디아어 Lydian | ||
U+10980 ~ U+1099F | 32자 | 메로에 상형문자 Meroitic Hieroglyphs | ||
U+109A0 ~ U+109FF | 96자 | 메로에 필기체 Meroitic Cursive | ||
U+10A00 ~ U+10A5F | 96자 | 카로슈티 Kharoshthi | ||
U+10A60 ~ U+10A7F | 32자 | 옛 예멘 문자 Old South Arabian | ||
U+10B00 ~ U+10B3F | 64자 | 아베스타 문자 Avestan | ||
U+10B40 ~ U+10B5F | 32자 | 파르티아 문자 Inscriptional Parthian | ||
U+10B60 ~ U+10B7F | 32자 | 팔레비 문자 Inscriptional Pahlavi | ||
U+10C00 ~ U+10C4F | 80자 | 돌궐 문자 Old Turkic | ||
U+11000 ~ U+1107F | 128자 | 브라흐미 문자 Brahmi | ||
U+11080 ~ U+110CF | 80자 | 카이티 문자 Kaithi | ||
U+110D0 ~ U+110FF | 48자 | 소라어 Sora Sompeng | ||
U+11100 ~ U+1114F | 80자 | 차크마 문자 Chakma | ||
U+11180 ~ U+111DF | 96자 | 샤라다 문자 Sharada | ||
U+11680 ~ U+116CF | 80자 | 타크리 문자 Takri | ||
U+12000 ~ U+123FF | 1,024자 | 쐐기 문자 Cuneiform | ||
U+12400 ~ U+1247F | 128자 | 쐐기 문자 숫자·문장 부호 Cuneiform Numbers and Punctuation | ||
U+13000 ~ U+1342F | 1,072자 | 이집트 상형문자 Egyptian Hieroglyphs | ||
U+16800 ~ U+16A3F | 576자 | 바뭄 문자 보충 Bamum Supplement | ||
U+16F00 ~ U+16F9F | 160자 | 몽어 Miao | ||
U+1B000 ~ U+1B0FF | 256자 | 가나 보충 Kana Supplement | ||
U+1D000 ~ U+1D0FF | 256자 | 비잔틴 시대의 악보용 기호 Byzantine Musical Symbols | ||
U+1D100 ~ U+1D1FF | 256자 | 악보용 기호 Musical Symbols | ||
U+1D200 ~ U+1D24F | 80자 | 고대 그리스 시대의 악보용 기호 Ancient Greek Musical Notation | ||
U+1D300 ~ U+1D35F | 96자 | 태현경 기호 Tai Xuan Jing Symbols | ||
U+1D360 ~ U+1D37F | 32자 | 산가지 Counting Rod Numerals | ||
U+1D400 ~ U+1D7FF | 1,024자 | 수학식에서 쓰이는 알파벳 Mathematical Alphanumeric Symbols | ||
U+1EE00 ~ U+1EEFF | 256자 | 수학식에서 쓰이는 아랍 문자 Arabic Mathematical Alphabetic Symbols | ||
U+1F000 ~ U+1F02F | 48자 | 마작 Mahjong Tiles | ||
U+1F030 ~ U+1F09F | 112자 | 도미노 Domino Tiles | ||
U+1F0A0 ~ U+1F0FF | 96자 | 플레잉 카드 Playing Cards[11] | ||
U+1F100 ~ U+1F1FF | 256자 | 괄호 문자 보충 Enclosed Alphanumeric Supplement | ||
U+1F200 ~ U+1F2FF | 256자 | 괄호 한자 보충 Enclosed Ideographic Supplement | ||
U+1F300 ~ U+1F5FF | 768자 | 이모지 Miscellaneous Symbols And Pictographs | ||
U+1F600 ~ U+1F64F | 80자 | 이모티콘 Emoticons | ||
U+1F680 ~ U+1F6FF | 128자 | 지도 기호 Transport And Map Symbols | ||
U+1F700 ~ U+1F77F | 128자 | 연금술 기호 Alchemical Symbols | ||
SIP | U+20000 ~ U+2A6DF | 42,720자 | 한중일 통합 한자 확장-B CJK Unified Ideographs Extension B | |
U+2A700 ~ U+2B73F | 4,160자 | 한중일 통합 한자 확장-C CJK Unified Ideographs Extension C | ||
U+2B740 ~ U+2B81F | 224자 | 한중일 통합 한자 확장-D CJK Unified Ideographs Extension D | ||
U+2F800 ~ U+2FA1F | 544자 | 한중일 호환용 한자 보충 CJK Compatibility Ideographs Supplement | ||
SSP | U+E0000 ~ U+E007F | 128자 | 태그 Tags | |
U+E0100 ~ U+E01EF | 240자 | 모양 구별 문자 보충 Variation Selectors Supplement | ||
PUA | U+F0000 ~ U+FFFFF | 65,536자 | 사용자 영역 보충-A Supplementary Private Use Area-A | |
U+100000 ~ U+10FFFF | 65,536자 | 사용자 영역 보충-B Supplementary Private Use Area-B |
BMP 내 글자 보기(영문)
SMP 내 글자 보기(영문)
SIP 내 글자 보기(영문)
TIP 내 글자 보기(영문)
SSP 내 글자 보기(영문)
4.2 유니코드와 한글
한글의 전산화 관련 문서 | |
한글 인코딩 | 조합형 · 완성형(한글 목록 · 중복 한자) · 조합형 완성형 논쟁 · 남북한 한글 코드의 충돌 문제 · 한컴 2바이트 코드 · 유니코드 |
타자기와 키보드 | 두벌식 · 세벌식(일반 자판 · 속기 자판) · 휴대전화 입력기 · 한영 키 |
- 한글 인코딩 문서도 참고하라.
유니코드에서 한글은 한자[12] 다음으로 많은 코드를 차지하고 있는 문자다. 이것은 동아시아권에서 사용하는 문자로서는 두 번째로 많은 영역을 차지하는 것이다. 왜 저렇게 많냐면 현대 한국어 음절 조합과 한글 자모를 모두 집어넣었기 때문이다. 한글의 경우, 현대 한국어의 자모 조합으로 나타낼 수 있는 모든 완성형 한글 11,172자(가, 각, 갂, 갃, …, 힠, 힡, 힢, 힣)이 모두 들어가 있다. 그래서 쿈이나 슌처럼 KS X 1001에서는 쓸 수 없는 글자들도 전혀 문제없이 쓸 수 있다.
또한 U+1100 ~ U+11FF, U+A960 ~ U+A97F, U+D7B0 ~ U+D7FF에 배당된 한글 자모는 한글을 조합형으로 구현할 수 있게 초·중·종성을 일일이 배당한 것이며, 여기에는 옛한글 낱자들도 같이 포함되어 있다. 그래서 ᄒᆞᆫ과 같은 옛한글도 옛한글 전용 글꼴만 있으면 문제없이 쓸 수 있다.
따라서 유니코드 환경이라면 현대 한글은 완성형으로도 조합형으로도 표현할 수 있지만, 조합형은 데이터 크기가 2~3배로 커지기 때문에 별로 사용되지 않는다. 보통 조합형은 옛한글을 표현할 때 쓰인다. 옛한글을 완성형으로 하나하나 배당하면 유니코드 전체를 뒤덮고도 남기 때문에 조합형으로 표현할 수밖에 없다.[13]
4.2.1 한글 전산화의 잔혹사(?)
대한민국의 한국어 컴퓨터 환경에서는 유니코드가 도입되기 전에는 KS C 5601(완성형, 이후 KS X 1001로 개칭됨)이라는 코드와 이에 기반한 EUC-KR 인코딩을 사용하였다. 그러나 완성형의 한글 글자 수는 2,350자로, 현대 한글이 표현할 수 있는 글자 중 빈도수가 높은 일부분만 수록되어 있는 상태였다. 이것 때문에 쿈을 쿈이라 쓰지 못하는 일이 있기도 했다. 이를 해결한 CP949/UHC(통합 완성형)라는 코드도 있는데 완성형에 없는 글자를 억지로 구겨 넣었기 때문에 코드가 자모 순으로 구성되지 않을 뿐만 아니라 코드 표준에 맞지 않게 구현한 프로그램이 많아서 자잘한 문제가 많았다.
유니코드는 1991년 발표된 1.0 버전부터 KS C 5601에 포함된 완성형 2,350자 한글을 지원하였다. 1993년 발표된 1.1 버전에는 KS C 5657(이후 KS X 1002)에 포함된 1,930자 및 중국에서 요청한 6글자를 포함한 기타 2,376자를 추가해 총 6,656자가 수록되었다. 믿기 어렵겠지만 유니코드 1.1에는 옛한글까지 고려한 조합형 한글 낱자도 포함되어 있었고(U+1100 - U+11FF) 실제로 이걸로 넘어가자는 제안도 있었다.[14] 그러나 당시 한국에서는 2,350자를 벗어난 현대 한글을 사용하려면 그냥 조합형을 사용하면 되었기 때문에 이렇게 추가된 6,656자 만으로는 유니코드 기반 완성형을 사용할 이유가 없었다. 조합형이라고 해서 상황이 나은 것도 아닌 게 첫가끝 기반 조합형은 90년대 초반까지 한국에서 사용한 조합형과는 달랐고, 지금도 OS X과 윈도우 사이에서 파일을 복사할 때 자주 글자가 풀려 버리는 등 이걸 제대로 지원하는 플랫폼은 흔치 않다. 완성형 한글도 한 번에 일괄적으로 추가되지 않았고 빠진 글자들이 단계 별로 추가되었기 때문에 배열 순서가 CP949/UHC보다도 개판이었고 나머지 4,516자를 추가하려고 해도 제대로 추가할 수가 없었다. 한편 유니코드 1.1을 지원했다가 한국에서 한동안 피를 본 프로그램 중 하나가 Oracle이었다. 자세한 사항은 해당 문서를 참조한다.
그래서 대한민국 대표는 유니코드 2.0 제정 시 완성형 현대 한글 11,172자를 가나다순으로 새 영역에 배당할 것을 요청했다. 이 때 각국 대표들 사이에서 논쟁이 오갔지만, 결국 대한민국 대표의 요청이 받아 들여져서 1996년 발표된 유니코드 2.0에서 1.1 때까지 U+3400 ~ U+4DFF[15]에 배당 되어 있던 한글 6,656자를 없애고 새 영역(U+AC00 ~ U+D7A3)에 가나다순으로 11,172자를 배당했다. 그리고 이 '한글 대이동 사건'을 계기로 2.0부터는 한 번 배당한 문자는 절대 옮기거나 없애지 않는다는 정책을 세웠다. 그리고 이렇게 배당 된 11172자가 2.0부터 현재까지 한글·한국어 처리에 쓰이고 있다. 이로 인해 유니코드 2.0 이상과 그 이전 버전은 서로 호환되지 않는다.
당연하게도 이 11,172자는 남한의 가나다순[16]으로 배당 되었다. 북한이 이것을 문제 삼아 이 11172자를 북한 식으로 재배열해 줄 것을 2000년경에 요구했으나, 이미 한글은 코드 위치가 한 번 대이동한 전례도 있고 문자를 절대 옮기거나 없애지 않는다는 정책에도 위배되기 때문에 보기 좋게 씹혔다. 그래서 북한은 울며 겨자 먹기로 남한 순으로 배당 된 11172자를 쓰고 있다. 이것만이 아니라 자기들이 우상화 목적으로 특수 문자 영역에 볼드 처리한 '김,일,성, 김,정,일'도 그대로 유니코드에 넣고자 했으나 당연히 퇴짜 맞았다. 문화어 참조.
한때 북한에서는 남한 가나다순으로 배당 된 유니코드의 한글 영역이 마음에 안 들어서 자기네들 순서를 기준으로 한글 영역을 쓴 적이 있었다. 남북한 한글 코드의 충돌 문제 문서 참고.
그리고 북한은 코드 순으로 정렬하면 북한 식으로 제대로 정렬이 되지 않는다는 것도 문제 삼았지만, 단순 코드 순 정렬은 어차피 그 어떤 언어에서도 적절하지 않으며, 정렬은 따로 테이블을 만들어서 해야 한다. 영어조차도 코드 순으로 정렬하면 대문자 Z가 소문자 a보다 앞에 온다.
4.2.2 조합형 낱자들로 만들 수 있는 한글 완성자의 수
유니코드에 있는 모든 한글 낱자는 다음과 같다. 자음의 경우 위의 것이 초성, 아래의 것이 종성이다.
일단 단순 계산으로만 125×95×138=1638750자가 나온다(!). 여기서 125, 95, 138은 각각 초성, 중성, 종성이 비어 있는 경우도 포함한 수치이다. 즉 '가'와 같이 종성이 없는 글자도, 'ᅟᅡᆫ'과 같이 초성이 없는 글자도(실제로 중성과 종성만으로 이뤄진 글자도 문헌에 있다), 'ᄒᅠᆫ'과 같이 중성이 없는 글자도 들어간 것이다.
다만, 여기서 다음 수만큼 빼야 한다.
- 1: 1638750자 중에서 한 글자는 초성, 중성, 종성이 모두 없는 글자이다. 즉 그냥 단순한 공백과 다를 바가 없다.
- 16988: 초성과 종성만으로 이뤄진 글자. 대한민국의 KS X 1026-1 규격(정보교환용 한글 처리지침)은 'ᄒᅠᆫ'과 같은 초성과 종성만의 결합은 허용하지 않는다. 즉 124×1×137=16988자가 된다.
즉 KS X 1026-1 규격상으로 허용되는 모든 한글 완성자는 1638750−(1+16988)=1621761자가 된다.
만약 초성, 중성, 종성 중 한 성분만으로 이뤄진 것을 단순히 낱자로 치고 완성자로 치지 않는다면, 다음 수만큼 빼야 할 것이다.
- 124: 초성만으로 이뤄진 글자 124×1×1
- 94: 중성만으로 이뤄진 글자 1×94×1
- 137: 종성만으로 이뤄진 글자 1×1×137
즉 초성, 중성, 종성 중 두 성분 이상으로 이뤄진 것만을 셀 경우, 1621761−(124+94+137)=1621406자가 될 것이다.
만약 초성, 중성, 종성 중 두 성분 이상으로 이뤄진 것에다가 초성과 종성만의 결합도 포함한다면 1621761+16988−(124+94+137)=1638394자가 될 것이다.
물론 어디까지나 '이론적으로' 160만 자 정도 나오는 것이고, 실제로 고문헌에 등장하는 글자 수는 5천여 자 정도밖에 안 된다고 한다. 현대 한글 낱자로 조합 가능한 11172자 중에서 실제로 쓰이는 건 2천 ~ 3천 자 정도밖에 안 되는 것과 비슷하다고 보면 된다. 물론 이런 안일(?)한 생각 때문에 초기 완성형과 같은 문제가 생겼던 건 안 자랑
참고로 저 1638750자를 빠짐없이 모두 나열한 곳이 존재한다(!). 혹시 전체 리스트가 필요하다면 저곳을 참고할 것.
4.3 유니코드와 한자
Windows 10에서는 MS만든 웹브라우저에서 일부 한자표현이 누락빼고 다른 웹브라우저와 메모장등 다른 곳에선 제대로 표현된다.
다른 이슈는 추가바람.
4.3.1 한중일 통합 한자와 한중일 호환용 한자의 차이
유니코드에서 가장 많은 코드를 점유하고 있는 문자는 한자이다. 일반적으로 쓰이는 것은 한중일 통합 한자 및 그 확장판들이며, 웬만하면 이 코드만 사용하는 것이 권장된다. 그러나 동아시아의 기존 국가 표준 인코딩에서는 동일한 한자에 중복된 코드가 할당돼 있는 경우가 있어서 이들을 한중일 호환용 한자에 수록하였다. 실수로 중복 배당된 문자(대만 Big5 코드에 중복 배당된 두 글자), 일부러 중복시킨 문자(대한민국 KS 코드[17], 일본의 IBM 확장 한자와 일부 JIS X 0213 한자[18]) 등이 한중일 호환용 한자에 들어갔다. 한중일 호환용 한자는 기존 동아시아 문자 코드와 왕복 변환을 위해 마련되었다.
호환용 문자는 다른 코드 체계와의 왕복 변환이 필요하지 않을 경우 웬만하면 안 쓰는 게 깔끔하기 때문에, 일부 소프트웨어는 한중일 호환용 한자가 입력되면 자동으로 거기에 해당되는 한중일 통합 한자로 자동 변환되는 기능을 내장하기도 한다.
4.3.2 미세한 이체자 처리 문제
현재 한자는 나라마다 표준이 다른데, 모양이 많이 다른 이체자[19]들은 각각 코드를 할당해 주고 있다. 예를 들어 '나라 국' 자의 경우 國과 国이 각각 다른 코드를 가진다.
문제는 모양이 크게 안 다른 이체자를 이체자로 인정할까 말까 하는 것인데, 이 중에 일부는 그냥 한 코드로 합병한 경우가 많다. 예를 들어 '평평할 평(平)'자의 경우 干에다 /\를 덧붙인 듯한 자형도 있고, 干에다 \/를 덧붙인 듯한 자형도 있는데, 둘 다 U+5E73으로 하되 구체적인 형태는 폰트에 따라 구분하게 하고 있다.[20][21] 결국 언어마다 선호하는 한자의 형태가 조금씩 다르기 때문에, 번거롭더라도 각 언어에 맞는 폰트 지정까지 해줘야 적합한 렌더링을 보장할 수 있을 것이다. 참고할 만한 글
그런데 이렇게 폰트를 통해 이체자 처리를 할 경우 폰트 지정이 곤란한 텍스트 문서에서는 구분이 불가능한 문제가 생긴다. 특히 일본의 경우 호적 전산화 등에서 이체자 처리를 정밀하게 하고 있어서 폰트를 지정하지 않고 문자 코드만 사용하여 이체자를 정확히 변별할 수 있는 기술에 대한 수요가 있는 상황[22][23]이다. 그래서 유니코드에서도 뒤늦게 이에 대응되는 기술의 필요성이 대두되어 현재 유니코드 내에 이체자 선택자(Ideographic Variation Selector, IVS)[24]라는 특수 문자 코드를 덧붙이는 방법도 도입돼 있고, 계속 구체적인 표준을 정하기 위해 작업 중인 듯하다. 이 방식은 한자용 문자와 IVS(화면상에 개별 문자로 표시되진 않음)를 연달아 입력하면 화면에 의도한 한자 한 글자가 지정한 이체자대로 표시되게 하는 식이다. 코드 상으로는 문자를 2개 입력했지만 실제 화면에는 1글자로 보이는 식.[25]
그러나 아직은 많은 소프트웨어·폰트들이 IVS에 대응되지 못하고 있는 상황인 데다가 IVS를 이용한 이체자 처리 규격 자체도 불완전한 상태이다. IVS 출력이 확실한 경우라면 상관 없겠지만, IVS 지원이 미흡한 기종에서도 열어볼 가능성이 큰 문서를 작성할 경우 이 방식의 사용을 지양하는 게 좋을 듯하다. 정 이체자를 정확히 표기해야 한다면 IVS 없이 해당 국가용으로 제작된 폰트로 지정해준다든가, 그것도 정상 작동을 보장할 수 없을 것 같으면 이미지 파일을 동원하는 게 좋을 듯하다. 참고로 현재까지 유니코드에 포섭된 IVS를 대부분 지원하는 폰트들은 여기(일본어)를 참고할 것.
이런 이체자들을 정리하는 사이트들도 있는데 그 중 하나가 글리프위키(일본어)라는 사이트다.[26] 일본어로 된 사이트이지만 한국어를 비롯한 다른 언어로 된 안내문들이 만들어져 있고(예) 회원 가입 시 옵션에서 일본어 외 다른 언어로 시스템 메시지를 바꿀 순 있다(현재 한국어 지원 중).
5 유니코드의 인코딩
유니코드 인코딩은 UTF-8, UTF-16, UTF-32 등이 있다.
유니코드와 유니코드 인코딩을 가장 쉽게 설명하는 방법은 유니코드는 각 글자에 숫자를 지정하는 방식을 말하면 인코딩은 유니코드 숫자를 저장하는 방식, 표현이라고 보면 된다.
예를 들어 A라는 글자를 숫자 65에 배당하는 것이 유니코드의 개념이고, 이 65라는 숫자를 2진수 8자릿수로 표현해서 0100 0010 라고 쓰거나, 혹은 16자릿수로 표현해서 0000 0000 0100 0010 이라고 쓸 수도 있는데 이것을 결정하는 것이 인코딩의 종류다.
5.1 UTF-8
5.1.1 문서에서 UTF-8
가장 많이 사용하는 유니코드 인코딩이다. UTF-16 인코딩을 사용하면 1바이트로도 표현할 수 있는 문자에 그보다 더 많은 바이트를 소비해야 하는데, UTF-8 인코딩을 사용하면 그런 문제점이 없다. 그러나 한자나 한글은 주로 3바이트 영역에 집중되어 있기 때문에 한자와 한글이 많이 포함되어 있는 문서는 오히려 크기가 커진다. 그럼에도 불구하고 세계적으로는 UTF-8 인코딩이 가장 널리 쓰이기 때문에 유니코드를 지원하는 대부분의 프로그램들은 일단 UTF-8을 디폴트 상태로 지정해 주는 경우가 많다. 게다가 UTF-8의 Latin-1 영역은 ISO/IEC 8859-1이라고 부르는 8비트짜리 서유럽 코드와 완벽히 호환된다는 장점이 있다. 웹 등지에서 유니코드 적용이 서구권을 중심으로 퍼졌기에 서구권 입장에서는 기존 8비트 코드와 호환성이 있는 UTF-8을 많이 선택했고, 결국 이것이 대세가 된 것이다.
UTF-8 인코딩의 특징은 1~4 바이트[27][28]의 가변 길이를 가지는 멀티바이트 캐릭터 형식이라는 점이다. 때문에 아스키 코드와 하위 호환성을 가진다. 아스키 코드의 0~127까지는 UTF-8로 완전히 동일하게 기록된다.
UTF-8은 엄밀히 따지면 유니코드의 데이터를 전송하기 위한 규격이지 문자 코드가 아니다.[29] 하지만 대부분의 문자 코드가 전송 규격으로서의 의미를 가지고 있기 때문에 문자 코드로 유용을 하고 있는 것 뿐이다.[30] 따라서 MS 계열 프레임워크에서 (VC++ 등등) 비 유니코드의 멀티바이트 캐릭터를 UTF-8 형식으로 변환하기 위해서는 와이드바이트 형식의 완전 2바이트 유니코드로 변환한 다음 다시 UTF-8 플래그를 주어 멀티바이트 형식으로 두 번 변환하는 과정이 필요하다. 그리고 Linux와 같은 MS 프레임워크 이외의 플랫폼에서도 명시적이지만 않을 뿐이지 내부적으로 유니코드로 변환한 후 처리되는 과정이 포함되어 있다.
한글 단어가 UTF-8 형식으로 어떻게 나올 것인지 궁금하다면 메모장과 같은 텍스트 에디터로 단어를 써서 UTF-8 형식으로 저장한 후 헥스 에디터를 이용하여 보면 된다. 다만 메모장을 쓸 경우 헥스 에디터로 열었을 때 EF BB BF라는 문자가 파일 가장 앞에 붙는다. 이것을 BOM(byte order mark)이라고 하는데 이건 빼고 그 뒤부터 보면 된다.[31][32] 해독할 때는 퍼센트 기호를 빼고 헥스 에디터에 그대로 쓴 다음 저장한 뒤 텍스트 에디터로 읽으면 된다. BOM은 각각 몇 가지 종류가 있고, 파일에 BOM이 써질 수도 있고 안 써질 수도 있으며, 유닉스/리눅스 계열에서는 쓰지 않는것이 관례라고 하니까 상황에 맞게 코딩을 하는 것이 필요하다. 특히 웹 프로그래밍을 할 때는 BOM을 안 쓰는데, 소스 코드 파일 여러개가 합쳐져서 하나의 웹 페이지를 구성하는 경우가 많다보니 BOM이 있으면 파일이 합쳐질 때 코드를 잘못 인식해서 에러가 나기 때문이다.
MS의 제품군이 UTF-8 에 BOM 을 붙여 인코딩 하는것은 유니코드 컨소시엄에서도 권장하지 않는 방법이다. 2.6 Encoding Schemes 사실 UTF-8은 굳이 Endian으로 따지면 Big-Endian방식 고정이기 때문에 BOM의 존재 자체가 의미가 없기 떄문이다.
이 때문에 GCC 등에서 컴파일되는 소스코드에 하드코딩된 유니코드 문자열이 있는 경우, Visual Studio에서는 BOM이 존재하지 않으면 ANSI또는 시스템 코드페이지로 소스코드를 읽어들여 문자열 오류가 나는 경우 또한 존재한다.
한글 페이지를 일본어 인코딩으로 해석하거나, 그 반대의 경우 등은 UTF-8이 아닌, 각 국가별 인코딩(EUC-KR, Shift-JIS 등)을 사용해서 발생하는 경우가 많다. (물론 유니코드 페이지도 다른 인코딩으로 지정하면 깨진다.)
웹 페이지에서 인코딩 선언을 해주는 건 기본 중의 기본임에도 불구하고, 그 기본을 지키지 않아서 글자가 깨지는 문제로 사용자가 수동으로 인코딩을 지정하게 하는 경우가 많다. 웹 페이지의 소스를 보면 <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 이렇게 적힌 부분이 있는데 여기서 charset=UTF-8 부분이 인코딩 선언이다.[33] 어떤 웹 페이지에는 저 UTF-8 대신에 EUC-KR이 적혀있기도 하다. HTML 5부터는 <meta charset="UTF-8" />와 같이 간단하게 쓸 수도 있다.
5.1.2 URL에서 UTF-8
- namu.wiki/w/유니코드
- namu.wiki/w/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
- %EC%9C%A0 = 유 (UTF-8: 0xec 0x9c 0xa0)
- %EB%8B%88 = 니 (UTF-8: 0xeb 0x8b 0x88)
- %EC%BD%94 = 코 (UTF-8: 0xec 0xbd 0x94)
- %EB%93%9C = 드 (UTF-8: 0xeb 0x93 0x9c)
URL에서 알파벳과 숫자 및 일부 특수 문자 영역 밖의 문자를 사용할 때 퍼센트 인코딩을 통해서 문자열을 인코딩해서 표시한다. 이들 이외의 문자열이 URL에 포함되어 있을 때 처리 방식은 엄밀하게 정의되어 있지 않으며, 웹 브라우저에 따라 어떻게 인코딩할 지 정책이 다르다. 문제는 퍼센트 인코딩은 유니코드 코드 포인트를 가리키는 것이 아니라 임의의 바이너리 데이터를 전송할 때 사용하는 방식이므로, 퍼센트 인코딩을 사용했다고 해서 항상 UTF-8로 인코딩된 유니코드 문자열이 왔다는 보장이 없다.
오래 된 버전의 Internet Explorer를 사용했다면 상당수 한국 웹 사이트를 사용할 때 그림 등이 제대로 보이지 않으면 "URL을 항상 UTF-8로 보내기" 옵션을 끄라는 말을 들어 보았을 것인데, 과거의 웹 개발자들이 퍼센트 인코딩, 유니코드, 문자 인코딩 등에 큰 신경을 쓰지 않았던 시절의 흔적이다. 퍼센트 인코딩을 적용시키지 않은 문자열이 URL 내부에 온 경우 저 옵션이 켜져 있으면 URL에 올 수 없는 문자열을 UTF-8로 인코딩한 값을 퍼센트 인코딩을 적용시켜서 웹 서버에 요청하지만, 한 때는 상당수 웹 서버가 EUC-KR 기반이었기 때문에 UTF-8 문자열이 오면 파일을 제대로 찾을 수 없는 문제가 있었다. 이 때 저 옵션을 꺼 버리면 EUC-KR로 URL 인코딩해 보내기 때문에 파일을 웹 서버에서 제대로 찾게 된다. 물론 지금은 웹 브라우저와 웹 서버가 모두 UTF-8를 가정하고 개발되는 경우가 많으며, EUC-KR 등 굳이 다른 인코딩을 사용하고 싶으면 웹 사이트 쪽에서 알아서 URL 인코딩해 주는 경우가 대부분이다. 다만 아직도 개발된 지 오래된 한국 웹 사이트는 UTF-8 인코딩된 문자열을 집어 넣었을 때 404 오류를 내뱉는 경우가 있다.
서버에 파일을 올리고 난 뒤에 파일명이 이상하게 변조될 때 UTF-8 방식으로 인코딩 된 것일 경우가 많다. ASCII 영역 밖 문자들이 치환되다 보니, 공백이나 특수 문자의 경우 많이 치환되는 편이며, 용도에 따라 URL용 특수 기호는 치환될 때도, 치환되지 않을 때도 있다.[34] 주로 치환되는 문자들을 나열하자면 다음과 같다.
- 공백(space): %20
- !: %21
- (: %28
- ): %29
- +: %2B
- -: %2D
- /: %2F
- [: %5B
- ]: %5D
- _: %5F
5.2 UTF-16
UTF-8과 마찬가지로 가변 길이 인코딩이다. 일반적인 이용에서 U+10000부터의 문자를 접할 일이 별로 없어서 대부분 2바이트로 표시할 수 있기 때문에 그런 인식이 퍼져 있을 뿐. U+10000 및 이후의 문자는 값에서 U+10000을 뺀 후 문자값을 10비트씩 쪼갠 후 각각 U+D800, U+DC00의 하위 10비트에 끼워 넣는 식으로 총 4바이트로 표현한다. 코드 중간에 '상위/하위 대체 영역'이라는 문자가 정의되지 않은 부분이 있는 것이 이를 위한 것이다. 이 방법을 이용하면 U+10000부터 U+10FFFF까지 4바이트를 이용하여 표현할 수 있다.
또한 기본적으로 2바이트의 순서가 정해진 것이 아니기에 시스템에 따라 BOM이 앞에 붙는다.
바이트 순서가 순차적인 것은 빅 엔디안, 역순인 겨은 리틀 엔디안이라고 하며, 걸리버 여행기에서 소인국 사람들이 달걀을 어느 쪽으로 깨먹는가라는 주제로 전쟁(...)을 벌인 내용에서 착안했다.
바이트의 순서가 정해진 것이 아니라는 점은 이 인코딩에서 문제를 초래하는데, 빅 엔디안을 사용하는 대부분의 시스템은 아예 BOM을 붙이지 않고, 리틀 엔디안을 사용하는 시스템은 이런 문서를 기본적으로 리틀 엔디안으로 읽는다. 반대로 리틀 엔디안을 사용하는 시스템은 항상 BOM을 붙이는데, 빅 엔디안만 사용하는 대부분의 시스템은 앞의 BOM을 BOM으로 인식하지 않고 문자로 읽어들여서 에러를 낼 가능성이 높다.[35]
이런 이유로 인터넷에서 정보교환용으로 UTF-16이나 UCS-2등 16비트 기반 인코딩은 사용하지 말라는 권고를 쉽게 접할 수 있다.
PHP가 버전 6에서 UTF-16을 사용하려고 하다가 개발에 난항을 겪고 취소되었다. 이미 웹 환경이 UTF-8이 대세가 된 것이 주 원인. 결국 10년 동안 PHP5로 버티다가 2015년 12월에서야 PHP7을 내놓았다.
참고로 .net framework에서 기본으로 UTF16을 사용한다. (Char타입은 기본적으로 2바이트를 쓰기 때문에 4바이트를 사용해야 하는 문자의 경우 Char를 array로 만들어 두개 써야 한다.)
5.3 UCS-2
UCS는 Unicode 이전에 사용되는 국제 인코딩 규격으로 'International Standard ISO/IEC 10646'에 정의되어 있다. UCS-2는 UTF-16에 대응되는 규격으로 U+FFFF까지는 UTF-16과 동일하나, 가변길이 부호화를 지원하지 않으므로 U+10000 이후의 문자열을 사용할 수 없다.
Microsoft Windows가 사용하는 기본 인코딩이다. 다만 완전 UCS-2와 동일하지는 않고 약간의 편법으로 유니코드 지원 이전에 가변길이 문자를 표시하는 방법을 이용해서 U+10000이상의 영역에 대해 처리한다. 더 최신의 정보에 대해서는 추가바람
전송을 위한 문서들의 경우 UTF8을 사용하지만 프로그램 내에서 사용하는 코드로는 UCS2 (혹은 UTF16이라고는 부르나 U+FFFF까지만 사용하니 사실상 UCS2라고 봐도 좋은)를 사용하는 경우도 많은데, 이는 가변길히 부호화를 지원하지 않기 때문에 Array상에서 인덱스=해당문자로 바로 접근이 가능해 그런 식으로 사용해야 하는 코드에 유리하기 때문이다. 따라서 UTF8로 전송받은 문서를 UCS16으로 변환해 저장해 사용하는 방식 등을 사용한다.
5.4 UTF-32
유니코드 문자 하나에 32비트를 이용하는 고정 길이 인코딩이다. 인터넷에서 정보교환용으로는 거의, 아니 사실상 전혀 이용되지 않는데 이는 낭비되는 용량이 너무 크기 때문이다. 유니코드 문자가 U+10FFFF까지 있으므로 총 21비트를 이용하는데 이는 32비트 중 11비트는 전혀 쓰일 일이 없다는 것이다. 그나마도 현재 이용되는 대부분의 문자가 U+FFFF 아래에 있으므로 16비트로도 거의 충분하므로 실제 낭비는 더 크다. 라틴 문자나 유럽 문자를 주로 쓴다면 거의 3/4가 낭비되는 셈이다. 또한 실제로 데이터가 저장될 때는 문자들의 위치가 32비트 단위로 딱딱 정렬되지 않는 경우가 많기 때문에[36] 처리 속도가 그리 빨라지지도 않는다. 게다가 HTML5에서는 UTF-16과의 구별에 문제가 생길 수 있다는 이유로 쓰지 말 것을 권고받는 굴욕도 받고 있다.
하지만 프로그램 내부적으로는 UTF-32가 자주 이용되는데, 이는 UTF-32에서는 가변 길이 부호화를 고려할 필요가 없어서 처리가 간단해지고, 현재의 컴퓨터 환경에서는 가장 기본적인 데이터 크기가 32비트이기 때문에 8비트나 16비트를 이용하는 것에 비해 성능 저하가 없으며 메모리 용량도 충분하기 때문이다. 예를 들어 Python 3.3 이상에서 내부적으로 UTF-32를 이용한다. 위의 UCS16이 사용되는 것과 비슷한 논리.
UTF32의 경우 고정길이기 때문에 2^32 = 약 43억개의 문자를 인코딩 하는 것이 가능한데, 만에하나 미래에 인류가 43억개의 문자 이상의 코드를 부여해야 하는 사태가 발생하면 UTF32로 표현 불가능한 문자들이 생겨나게 되는데, 이는 당분간은 상당한 미래 이야기 일것이다.
6 유니코드 정규화
같은 모양의 글자를 서로 다른 코드로 표현이 가능할 때, 유일한 코드로 "정규화" 하여 이용하는 것. 대표적으로,
- 한글의 첫가끝: "뷁"과 "ㅂㅜㅔㄹㄱ"을 "뷁"(NFC방식) 또는 "ㅂㅜㅔㄹㄱ"(NFD방식) 중 하나로 바꿔 사용. 이것이 꼬이면 자소 문자 깨짐이 발생한다. 특히 macOS와 Windows사이에서 파일 교환시 한글이 분리되는 사례는 널리 알려져 있다. 해결을 위해 일괄적으로 수정해주는 프로그램이 웹 곳곳에 돌아다니는 듯 하다.
- 한중일 호환용 한자를 한중일월 통합 한자로 바꿔 사용. 대표적 사례로 樂이나, 樂 또는, 樂을 樂으로 바꿔 사용.
즐길 락, 즐길 낙, 노래 악, 좋아할 요
정규화 되지 않고 섞여서 쓰게 되면 정렬 순서가 꼬이고, 검색이 안되는 사태가 발생한다. 樂을 검색했는데 樂이 안나와
7 유니코드 지원 폰트
유니코드를 바탕으로 각종 문자들을 지원하는 폰트에 대한 정보는 백괴사전의 윤희코드 특수문자 도움말이 상세하게 되어 있으니 관심있는 사람들은 찾아 보기 바란다. 백괴사전에서 백괴사전:, 도움말:로 시작하는 문서는 각종 드립이 생략된 순수 정보 제공 문서다.
8 개별 문서가 있는 유니코드 문자
- ! (U+0021)
- # (U+0023)
- % (U+0025)
- & (U+0026)
- * (U+002A)
- , (U+002C)
- - (U+002D)
- . (U+002E)
- / (U+002F)
- ; (U+003B)
- ? (U+003F)
- @ (U+0040)
- \\ (U+005C)
- [[_| _ ]] (U+005F)
- [[\|]] (U+007C)
- ~ (U+007E)
- NBSP (U+00A0)
- SHY (U+00AD)
- · (U+00B7)
- † (U+2020), ‡ (U+2021)
- RLO (U+202E)
- ‰ (U+2030)
- ※ (U+203B)
- ∇ (U+2207)
- √ (U+221A)
- ⑨ (U+2468)
- ☆ (U+2606)
- ♡ (U+2661)
- 々 (U+3005)
- ㆍ (U+318D)
- ㉾ (U+327E)
- BOM (U+FEFF)
9 관련 문서
- ↑ 연합뉴스 홈페이지에서 실제 일어났던 상황이다. 유니코드를 지원하는데도 한자 표기를 원칙적으로 한국에서만 쓰는 한자로 표기하고 있다. 유니코드를 쓰면 다른 한자 사용국의 한자도 표기할 수 있는데도 굳이 한자를 억지로 파자해 놓았다.
그게 그렇게 어렵나혹은 기자 송고 시스템이 EUC-KR을 강제하고 있다든가 - ↑ 주로 네 자리로 표기한다.
- ↑ SIP와 SSP 사이에 TIP라는 영역이 정의되어 있지만, 아직 여기에 속하는 글자가 없다.
- ↑ 2013년 5월 기준으로 6.2 버전이다.
- ↑ 아스키 코드와 완벽히 호환되기 때문에 영미권 사용자는 일찌감치 UTF-8로 갈아탔다.
덕분에 애먼 동양권 사용자만 새됐다 - ↑ 정확한 번역은 라틴 기본 '문자'. 언어와 문자는 다르다. 이하 무슨무슨어(語)로 번역되어 있는 것도 무슨 문자로 고쳐 보아야 한다.
- ↑ 옛한글이 포함된 조합형
- ↑ 유니코드 1.0에서 U+4E00(一)부터 U+9FA5(龥)가 처음으로 배당된 이후, 2015년 6월 17일 현재 유니코드 8.0에 이르기까지 U+9FA6(龦)부터 U+9FD5(鿕)에 48개의 문자가 새로 추가되었는데, 이 추가된 부분은 자주 무시당한다(…). 추가할 한자 수가 적으면 새로 한자 확장 영역을 만들지 않고 그냥 이 영역에다가 몇 글자씩 추가하는 듯하다. 이 영역의 마지막인 U+9FFF까지는 42개의 공란이 남아 있는 상황.
- ↑ '힣'(U+D7A3) 뒤의 비어 있는 12자(U+D7A4 ~ U+D7AF)를 포함하였다.
- ↑ 말 그대로, 글꼴 제작자의 입맛에 따라 어떤 글자를 넣어도 터치를 안 하는 영역이다. 그래서 이 부분은 보통 비어 있다.
- ↑ 일반적인 플레잉 카드 외에 게임용 타로 카드(타로 누보)의 트럼프(메이저 아르카나) 21장, 그리고 궁정 카드의 기사 카드 4장 등을 더 포함한다.
- ↑ 유니코드에 등록된 한자는 무려 7만 자가 넘는다.
- ↑ 한글의 특성상 자모 하나가 추가되면 조합 가능한 글자 수는 배로 늘어나고, 실제로 유니코드에 배당된 조합형 낱자들로 조합 가능한 글자 수는 백만 개 이상이다.
실현된다면 한자를 능가하는 민폐 - ↑ 출처: 단일문자 표준 연구, 한국전산원, 1993년 6월
- ↑ 현재 이 부분에는 한자가 들어 있다.
- ↑ 남한과 북한은 한글 낱자의 정렬 순서가 다르다. 남한은 광복 이전부터 쓰던 것을 그대로 쓰고 있지만, 북한은 자체적으로 순서를 새로 짠 것이다. 굳이 정통을 따지자면 남한이 정통인 셈. 북한에서는 ㄱ,ㄴ,ㄷ,ㄹ,ㅁ,ㅂ,ㅅ,ㅈ,ㅊ,ㅋ,ㅌ,ㅍ,ㅎ,ㄲ,ㄸ,ㅉ,ㅃ,ㅆ,ㅇ 순이다.
- ↑ 자주 쓰이는 한자가 음이 여러 개 있을 경우 발음에 따라 한자를 중복 할당했다(완성형/중복 한자 참고). 유니코드에서는 중복된 글자들 중 하나만 대표로 한중일 통합 한자에 대응시키고, 나머지는 한중일 호환용 한자에 대응시켰다.
- ↑ 획에 미세한 차이만 있는 이체자 몇 가지를 중복 수록했는데, 그 중에 너무 미세한 차이만 있는 경우 또는 이미 통합 한자에서 통합된 글자는 유니코드에서 한중일 호환용 한자에 대응시켰다.
- ↑ 훈·음은 같지만 형태가 다른 한자.
- ↑ 이렇게 비슷하게 생긴 문자를 같은 코드로 병합하고 폰트에 따라 알아서 만들게 하는 경우는 한자 외에도 있다. 예를 들어 말 줄임표로 쓰는 점 세 개(…, U+2026)의 경우, 동아시아 언어용으로 제작된 폰트들은 거의 다 가운뎃점(·)이 세 개가 연달아 있는 형태로 렌더링되지만, 서양 언어용으로 제작된 폰트에서는 그냥 점(.) 세 개가 연달아 있는 형태로 렌더링되는 경우가 많다.
- ↑ 단, 이런 식으로 차이가 크지 않은 이체자들을 한 코드로 합병하여 한중일 통합 한자에 추가한 글자 중에는, 그 글자에 대응되는 일부 이체자를 위해 한중일 호환용 한자에 중복 추가한 경우도 있다(주로, 일본 문자코드 내에 등록된, 자형이 비슷한 이체자와의 왕복 변환을 위해 할당됨). 예를 들어 '바다 해' 자의 경우 한중일 통합 한자에 海(U+6D77)가 등록돼 있는데, 이 글자의 마지막 구성요소가 母(어미 모) 형태로 렌더링돼도 되고(한국어, 중국어 정체·간체, 일본 구자체) 毋(말 무) 형태로 렌더링돼도 된다(일본 신자체). 그래서 Windows에서 한국어·중국어(정체/간체) 입력기로 바다 해를 입력하든 일본어(신자체) 입력기로 바다 해를 입력하든 유니코드의 海(U+6D77)에 해당되는 문자가 입력되며 글자 형태는 폰트에 따라 결정되므로, 언어별 폰트를 적절히 지정해 줘야 해당 언어에 적절한 한자체로 표시된다. 반면에 한중일 호환용 한자에 추가된 海(U+FA45)는 해당 부분이 반드시 母(어미 모)의 형태로 렌더링돼야 한다. 한중일 호환용 한자의 海(U+FA45)는 본래 일본 문자 코드에서 구자체를 정확히 렌더링할 때를 위해 추가된 '바다 해' 자와 연동돼 있는 듯한데, 꼭 필요한 경우가 아니라면 사용하지 않는 게 좋을 듯 하다.
- ↑ 국가 표준은 아니지만 일본 일각에서 쓰이고 있는 몇몇 문자 코드 체계(예를 들면 TRON 코드#나 금석문자경# 등)들은 유니코드에서 다른 코드로 할당하지 않는 미세한 이체자들을 별도의 문자 코드로 할당한다.
- ↑ 일본인들은 다른 나라 사람들보다 자잘한 부분을 더 꼼꼼하게 준비하는 성격이 강하다. 축소지향적 일본인이라는 표현이 괜히 나온 게 아니다. 그러다 보니 다른 나라에서는 수요가 크지 않은 이체자의 세밀한 전산화에 대한 수요가 어느 정도 있고 관련 제품들도 거의 일본제가 많다.
- ↑ 유니코드 컨소시엄의 설명(영어), 일본어 위키백과의 설명. 확실히 이체자 전산화에 일본인들의 관심이 지대하다는 점이 위키백과에서도 확인된다. 2008년에 일본어판에서는 위키백과 내에서 처음으로 IVS에 대한 독립적인 위키백과 문서를 신설했다. 그리고 2014년 11월 현재 일본어판 위키백과의 IVS 문서는 내용이 매우 상세한 상태인데 다른 언어판으로는 독립적인 IVS 문서가 아예 없는 상황이다. 일본어판 혼자 IVS 문서가 있으면서 내용이 상세하기까지 하니 이 부분에 대한 일본인들의 관심이 얼마나 큰지 짐작할 수 있다.
- ↑ 이렇게 여러 문자를 한데 조합해서 출력해주는 방식은 한자 외의 문자에도 여럿 있다. 악센트 기호가 붙은 라틴 문자를 종종 이런 방식으로 입력하기도 한다.
- ↑ 각 이체자(글리프)마다 문서를 만드는데 문서 제목은 유니코드의 고유 코드를 기준으로 한다. 하지만 아직 유니코드에 수록되지 않은 자형들도 한데 정리한다. 참고로 이 사이트는 미디어위키를 수정한 엔진을 사용하는 위키위키 사이트다.
- ↑ 한글은 주로 3바이트 구간에 존재. 이 때문에 EUC-KR로 작성된 한글이 많은 웹페이지나 텍스트 문서를 UTF-8로 변환하면 데이터 크기가 늘어나는 것을 볼 수 있다. 2바이트가 3바이트가 되면서 글자 하나당 데이터 크기가 1.5배가 되기 때문이다.
- ↑ UTF-8로 표현 가능한 길이는 최대 6바이트지만, 다른 인코딩과의 호환을 위해 4바이트의 절반까지 길이를 제한 하였다. 어차피 유니코드는 U+10FFFF까지만 이용하기 때문에 4바이트면 충분하다.
- ↑ UTF 자체가 유니코드 전송 형식(Unicode Transfer Format)이라는 뜻이다.
- ↑ 같은 의미로 UTF-16도 전송 규격이지만 이 규격이 실제 유니코드의 BMP0과 완전히 일치한다.
- ↑ 다만 서버사이드 스크립트에서 헤더 요청을 할 때에는 상황이 달라진다. 보통 헤더 요청(주로 로그인 상태 유지를 위한 세션에 쓰임)은 출력이 있기 이전에 처리되어야 하는 사항인데, BOM이 있으면 그것이 출력이 되어 버리기 때문에 헤더 요청이 전부 도로아미타불이 되어버린다(…)
덤으로 에러 메시지의 향연이 펼쳐진다더욱이 BOM은 보이지도 않는다! 그래서 서버사이드 스크립트는 절대로 메모장으로 작업하지 않는다.그리고 메모장코딩을 하던 사람들은 헥스 에디터로 BOM을 확인하고 절망한다 - ↑ UTF-8이 아닌 유니코드 자체의 BOM은 FE FF 또는 CPU 정렬 방식에 따라 FF FE가 될 수 있다.
- ↑ text/html 대신에 application/xhtml+xml 이 적힌 곳도 있고 아예 다른 게 있을 수도 있다.
- ↑ 자바스크립트 기준으로 모두 치환하면 escape() 메서드를, URL용 : / ; ? 를 남기려면 encodeURI()나, encodeURIComponent() 메서드를 쓰며, 그 결과로 이렇게 된다.
- ↑ 일이 이렇게 된 것은 컴퓨터 환경이 8비트에서 16비트로 넘어갈 때, 일부 제조사는 기존 8비트와의 호환성 향상을 목적으로 16비트(2바이트) 데이터의 뒤쪽 바이트를 앞 바이트보다 빠른 주소에 넣도록 시스템을 구성(이것을 리틀 엔디안이라고 함)했기 때문이다. 참고로 이렇게 만들어진 가장 대표적인 시스템이 x86이다.
- ↑ 문자가 4바이트(32비트)를 차지하므로 파일에서 각 문자가 0, 4, 8, 12, 16...같이 4의 배수로 배열되면 좋겠지만 실제로는 0, 6, 10, 14, 18...같은 식으로 4의 배수 형태가 아닌 경우가 생길 수 있다.
- ↑ 문서에서 뜬금없이 드립 소재로 나오는 경우가 많다. 백괴사전에서는 유니코드를 윤희 황제가 창시한 '윤희코드'라고 부른다(...)