Unicode
유니코드(Unicode)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이며, 유니코드 협회(Unicode Consortium)가 제정한다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자들을 다루기 위한 알고리즘 등을 포함하고 있다.
유니코드의 목적은 현존하는 문자 인코딩 방법들을 모두 유니코드로 교체하려는 것이다. 기존의 인코딩들은 그 규모나 범위 면에서 한정되어 있고, 다국어 환경에서는 서로 호환되지 않는 문제점이 있었다. 유니코드가 다양한 문자 집합들을 통합하는 데 성공하면서 유니코드는 컴퓨터 소프트웨어의 국제화와 지역화에 널리 사용되게 되었으며, 비교적 최근의 기술인 XML, 자바, 그리고 최신 운영 체제 등에서도 지원하고 있다.
유니코드에서 한국어 발음을 나타날 때는 예일 로마자 표기법의 변형인 ISO/TR 11941을 사용하고 있다.
What is unicode
Unicode provides a unique number for every character,
no matter what the platform,
no matter what the program,
no matter what the language.
Unicode는 모든 문자에 index를 줘 놓은 것이다. 더 이상도 아니고, 더 이하도 아니다. 이 index를 code point라고 부르는데, 그냥 index라고 칭하도록 한다.
- 'A'라는 글자는 0x0041 이라는 index를 가진다.
- 'a'라는 글자는 0x0061 이라는 index를 가진다.
- '가'라는 글자는 0xac00 이라는 index를 가진다.
더 많은 글자와 index를 보려면 http://www.unicode.org/charts/ 를 참고하면 된다. 위와같이 정해져 있는 index를 표시하는 방법에는 UTF와 UCS두가지 종류가 있다.
유니코드란, 숫자와 글자, 즉 키와 값이 1:1로 매핑된 형태의 코드표 인다. UTF-8, EUC-KR 들은 인코딩 방식이다.
Terms
유니코드 관련 문서를 읽다보면 가장 많이 마주치는 용어들이 UCS2, UCS4, UTF8, UTF16, UTF32 등과 같은 단어들입니다.
- 기본언어판, BMP (Basic Mulitilingual Plane)
- 유니코드의 첫 65,536개의 코드를 의미합니다.
- 언어판, Plane (256x256 즉 65,536 개씩의 코드 묶음)
- 유니코드에서는 현재 17개의 언어판을 사용할 수 있습니다. 모두 그룹 00에 포함됩니다.
- 언어판 그룹, Group (256개씩의 언어판을 묶어 하나의 그룹)
- 유니코드의 17개 언어판은 모두 Group 00에 있습니다. 유니코드는 17개의 언어판에 한정되어 정의됩니다. 반면 ISO 표준(UCS-4)에서는 모두 128개의 언어판 그룹이 정의될 수 있습니다.
- 1 Plane = 65,536 code points
- 1 Group = 256 planes = 256x65,536 = 16,777,216 code points
- UCS-4 = 128 groups = 128x16,777,216 = 2,147,483,648 code points
- 인코딩, Encoding (문자집합을 표현하는 방식)
- 유니코드는 코드체계 또는 문자집합을 명명하는 것이며 이를 표현하기 위해서는 UTF-8, UTF-16, UTF-32 등과 같은 인코딩이 필요합니다.
- UCS-2: Universal Character Set 2(octets)
- 좀더 정확하게는 Universal Multipe-Octet Coded Character Set 2입니다. ISO/IEC 10646의 용어로 BMP의 65,536 코드를 정의하며, 2바이트로 표현됩니다. 1개의 언어판, 즉 BMP만이 이에 해당합니다. UCS-2는 인코딩 방법이 아니며 문자코드 자체입니다. 인코딩으로 봐도 무방하겠군요. 여기서 octet이라는 용어를 사용했는데 이 용어는 ISO쪽에서 사용하는 용어로, 유니코드 진영에서 사용하는 바이트와 같은 뜻입니다
- UCS-4: Universal Character Set 4(octets)
- ISO/IEC 10646의 용어로 4바이트로 표현됩니다. 모두 128개의 언어판 그룹, 즉 128*256 언어판 = 32,768 언어판을 정의합니다. 이는 대략 231 = 2,147,483,648개의 코드에 해당합니다. UCS-4는 인코딩 방법이 아니며 문자코드 자체입니다.
- UTF-8: UCS Transformation Format, 8-bit form
- Unicode 표준의 인코딩 방식중의 하나입니다. 표준에서는 17개 언어판의 문자만을 표현할 수 있으나 기술적으로는 UCS-4 전영역의 문자를 표현할 수 있습니다. 문자에 따라 1 ~ 4(또는 6) 바이트로 표현됩니다.
- UTF-16: UCS Transformation Format, 16-bit form
- 유니코드 3.0에서는 16을 16비트로 해석한 것이 아니라, 그룹 00의 16개 언어판이라고 써 놓았군요. UTF-32의 32가 32비트를 지칭하므로 통일성을 위해 16비트로 이해하시는 게 좋습니다. 16비트로 표현한다는 점에서는 UCS-2와 흡사하지만 대행문자영역(Surrogates)을 이용하여 16개의 보충 언어판 코드를 표현할 수 있는 인코딩입니다. 대행문자영역 2개로 16개의 보충 언어판을 표현할 수 있습니다. UCS-2에서는 65536개의 코드만을 정의할 수 있으나 UTF-16에서는 1백만여자를 더 표현할 수 있습니다.
- UTF-32: UCS Transformation Format, 32-bit form
- 32비트 즉 4바이트로 각 문자를 표현합니다. 이점에서 UCS-4와 동일하지만 17개의 언어판만을 정의한다는 점에서는 UCS-4의 부분집합으로 간주하면 됩니다. UCS-4와 동일하나 0x00000000 ~ 0x0010FFFF 범위만을 문자코드로 간주한다고 이해하시면 됩니다.
Convert encoding
UTF-8, UTF-16, UTF-32, UCS-2, UCS-4 는 모두 unicode의 문자 index를 나타내기 위한 방법이기 때문에, 서로간의 변환은 당연히 잘 된다. (단, UCS-2는 한계를 가지고 있다)
Is Unicode in C++ actually UTF-16?
- Is Unicode in C++ actually UTF-16? Is wchar_t type only compatible with UTF-16? Can char type represent UTF-8 or only ANSI? (MVP, Microsoft Community Contributor 답변)
I wonder if all of the functions marked with W suffix for Unicode, actually accept UTF-16 text only, or are they capable to handle other UTFs?
All Windows API functions that accept LP[C]WSTR expect UTF-16 encoding.
And what about wchar_t type itself, is it made to specifically handle UTF-16 characters and strings?
Formally speaking, no. The size of wchar_t is implementation-defined, and in fact most Linux compilers (such as GCC) define it to be 32-bit large, designed to hold text in UTF-32 encoding. With MSVC compiler, wchar_t is 16-bit large, with the intention that it be used to represent Unicode strings in UTF-16 encoding.
http://www.joelonsoftware.com/articles/Unicode.html
Yes. A UTF-8 string is a sequence of 8-bit elements (hence '8' in its name), and is thus readily representable in an array of char.
Plane (Unicode block)
유니코드 평면은 유니코드 전체를 논리적으로 나눈 구획을 말한다. 0번(다국어 기본 평면)에서부터 16번까지 모두 17개로 나뉘며, 각 평면은 65536개(216개)의 코드로 구성된다.
유니코드에는 연속된 코드 포인트의 집합인 블록(block)들이 있다. 블록의 이름은 유일하며, 다른 블록과 겹치지 않는다. 블록의 크기는 16의 배수이며, 한 블록은 16의 배수(U+nnn0)인 코드 포인트로 시작한다. 블록은 미등록(unassigned) 상태인 코드 포인트 등을 포함할 수 있다.
유니코드 8.0에는 262개의 블록이 있다. 이 중 160개는 평면 0인 다국어 기본 평면(BMP)에 있고, 93개는 평면 1인 보충 평면(SMP)에, 5개는 평면 2인 보조 표의문자 평면(SIP)에, 2개는 평면 14인 보조 특수목적 평면(SSP)에, 그리고 평면 15와 평면 16 전체가 각각 '보조 사용자 영역 A'(Supplementary Private Use Area-A), '보조 사용자 영역 B'(Supplementary Private Use Area-B)로 존재한다.
유니코드 목록 | ||||||||
다국어 기본 평면 | 다국어 보충 평면 | 상형 문자 보충 평면 | 상형 문자 제3 평면 | 특수 목적 보충 평면 | 사용자 정의 문자 | |||
0000~0FFF | 8000~8FFF | 10000~10FFF | 18000~18FFF | 20000~20FFF | 28000~28FFF | 문자 없음 | E0000~E0FFF | F0000~FFFFF |
Basic Multilingual Plane
다국어 기본 평면(영어: Basic multilingual plane, BMP)은 유니코드의 첫째(0번) 평면으로, U+0000
부터 U+FFFF
까지의 영역을 차지한다. BMP에는 거의 모든 근대 문자와 특수 문자가 포함되어 있으며, 그 중 대부분은 한글과 한중일 통합 한자들로 이루어져 있다.
Private Use Area Planes
약자로 PUA, 2개의 평면 15 및 16 (16진수의 평면 F 및 10)은 각각 "개인 사용 영역"을 포함합니다.
여기에는 PUA-A(Supplementary Private Use Area-A) 및 PUA-B(Supplementary Private Use Area-B)라는 블록이 포함되어 있습니다.
개인 사용 영역은 ISO 및 유니코드(개인 문자 인코딩) 외부의 당사자가 사용할 수 있습니다.
Plane | Block range | Block name |
15 PUA-A | U+F0000..U+FFFFF | Supplementary Private Use Area-A |
16 PUA-B | U+100000..U+10FFFF | Supplementary Private Use Area-B |
참고로 Material Design Icons (MDI)가 PUA-A 영역에 해당하는 코드를 사용한다.
List of blocks
Musical Symbols
- Range 1D100–1D1FF
- http://www.unicode.org/charts/PDF/U1D100.pdf
-
U1D100.pdf
Standard Music Font Layout (SMuFL) 항목 참조.
유니코드에서의 한글
- [추천] Gist - 한글과 유니코드 1
See also
Favorite site
- Wikipedia (en) Unicode
- Unicode® character table
- The Unicode Consortium
- Glossary of Unicode Terms (유니코드 용어집) 2
- D2 Naver: 한글 인코딩의 이해 1편: 한글 인코딩의 역사와 유니코드 3
- D2 Naver: 한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리 4
- 유니코드, UTF-8, UTF-16, UTF-32 간단 정리
Tutorials
Online tools
- Shapecatcher - 비슷한 Unicode 문자 찾기
- 화면에 그림을 그리면 비슷한 유니코드 문자를 찾아주는 웹사이트
- 현재 11817개의 문자가 DB에 있음
- 한국어/일본어/중국어 문자는 현재 지원되지 않음 (지원 예정)
- 2012년 이후로는..거의 방치된 거 같네요...