Skip to content

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?

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.

Also, what's the difference between UTF-8 and ANSI?

http://www.joelonsoftware.com/articles/Unicode.html

Can a character of char type or string of char type characters handle UTF-8?

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)로 존재한다.

유니코드 목록

다국어 기본 평면
BMP

다국어 보충 평면
SMP

상형 문자 보충 평면
SIP

상형 문자 제3 평면
TIP

특수 목적 보충 평면
SSP

사용자 정의 문자
PUA

0000~0FFF
1000~1FFF
2000~2FFF
3000~3FFF
4000~4FFF
5000~5FFF
6000~6FFF
7000~7FFF

8000~8FFF
9000~9FFF
A000~AFFF
B000~BFFF
C000~CFFF
D000~DFFF
E000~EFFF
F000~FFFF

10000~10FFF
11000~11FFF
12000~12FFF
13000~13FFF
14000~14FFF

16000~16FFF
17000~17FFF

18000~18FFF


1B000~1BFFF

1D000~1DFFF
1E000~1EFFF
1F000~1FFFF

20000~20FFF
21000~21FFF
22000~22FFF
23000~23FFF
24000~24FFF
25000~25FFF
26000~26FFF
27000~27FFF

28000~28FFF
29000~29FFF
2A000~2AFFF
2B000~2BFFF
2C000~2CFFF


2F000~2FFFF

문자 없음

E0000~E0FFF

F0000~FFFFF
100000~10FFFF

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

Standard Music Font Layout (SMuFL) 항목 참조.

유니코드에서의 한글

See also

Favorite site

Tutorials

Online tools

  • Shapecatcher - 비슷한 Unicode 문자 찾기
    • 화면에 그림을 그리면 비슷한 유니코드 문자를 찾아주는 웹사이트
    • 현재 11817개의 문자가 DB에 있음
    • 한국어/일본어/중국어 문자는 현재 지원되지 않음 (지원 예정)
    • 2012년 이후로는..거의 방치된 거 같네요...

References


  1. Korean_and_Unicode.zip 

  2. Glossary_of_Unicode_Terms_-_unicode_v9.0.pdf 

  3. D2_naver_helloworld_-_Korean_encoding_01.pdf 

  4. D2_naver_helloworld_-_Korean_encoding_02.pdf 

  5. Bsidesoft.com_-_unicode_01.pdf 

  6. Bsidesoft.com_-_unicode_02.pdf 

  7. Bsidesoft.com_-_unicode_03.pdf