Unicode Character Table 


Hangul Jamo(1100-11FF): http://bit.ly/2ncPiGV

Hangul Compatibility Jamo(3130-318F): http://bit.ly/2ncMwBj

Hangul Syllables(AC00-D7AF): http://bit.ly/2ncFTiF



CP949 to Unicode Table:

http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT


Keyboard의 표시된 기호들을 Unicode에서는 어떻게 읽는가?

ASCII table에 printable characters(Space ~ Tilt)를 가지고 변환해 보았다.


기호들중에 우리가 보통 칭하는 이름과는 다른 것들이 있었다. 

예를 들면 ^(Caret) 와 같이 내가 알고 있는 것과 다른것도 있었고, `(Grave Accent)처럼 어떻게 읽는지 신경쓰지 않고 있었던 것도 있었다.

 

# / 47 0x2f SOLIDUS

# ^ 94 0x5e CIRCUMFLEX ACCENT

# | 124 0x7c VERTICAL LINE



#!/usr/bin/env python

# -*- encoding: utf-8 -*-


# how to read Printable characters in ASCII


import unicodedata



# printable charaters in ASCII

# 32~126

SPACE = ord(' ')

TILT = ord('~')

for c in range(TILT - SPACE + 1):

    s = chr(SPACE + c)

    u = unicode(s)

    text = unicodedata.name(u)

    print u.encode('utf8'), SPACE + c, hex(SPACE + c), text


#   32 0x20 SPACE

# ! 33 0x21 EXCLAMATION MARK

# " 34 0x22 QUOTATION MARK

# # 35 0x23 NUMBER SIGN

# $ 36 0x24 DOLLAR SIGN

# % 37 0x25 PERCENT SIGN

# & 38 0x26 AMPERSAND

# ' 39 0x27 APOSTROPHE

# ( 40 0x28 LEFT PARENTHESIS

# ) 41 0x29 RIGHT PARENTHESIS

# * 42 0x2a ASTERISK

# + 43 0x2b PLUS SIGN

# , 44 0x2c COMMA

# - 45 0x2d HYPHEN-MINUS

# . 46 0x2e FULL STOP

# / 47 0x2f SOLIDUS

# 0 48 0x30 DIGIT ZERO

# 1 49 0x31 DIGIT ONE

# 2 50 0x32 DIGIT TWO

# 3 51 0x33 DIGIT THREE

# 4 52 0x34 DIGIT FOUR

# 5 53 0x35 DIGIT FIVE

# 6 54 0x36 DIGIT SIX

# 7 55 0x37 DIGIT SEVEN

# 8 56 0x38 DIGIT EIGHT

# 9 57 0x39 DIGIT NINE

# : 58 0x3a COLON

# ; 59 0x3b SEMICOLON

# < 60 0x3c LESS-THAN SIGN

# = 61 0x3d EQUALS SIGN

# > 62 0x3e GREATER-THAN SIGN

# ? 63 0x3f QUESTION MARK

# @ 64 0x40 COMMERCIAL AT

# A 65 0x41 LATIN CAPITAL LETTER A

# B 66 0x42 LATIN CAPITAL LETTER B

# C 67 0x43 LATIN CAPITAL LETTER C

# D 68 0x44 LATIN CAPITAL LETTER D

# E 69 0x45 LATIN CAPITAL LETTER E

# F 70 0x46 LATIN CAPITAL LETTER F

# G 71 0x47 LATIN CAPITAL LETTER G

# H 72 0x48 LATIN CAPITAL LETTER H

# I 73 0x49 LATIN CAPITAL LETTER I

# J 74 0x4a LATIN CAPITAL LETTER J

# K 75 0x4b LATIN CAPITAL LETTER K

# L 76 0x4c LATIN CAPITAL LETTER L

# M 77 0x4d LATIN CAPITAL LETTER M

# N 78 0x4e LATIN CAPITAL LETTER N

# O 79 0x4f LATIN CAPITAL LETTER O

# P 80 0x50 LATIN CAPITAL LETTER P

# Q 81 0x51 LATIN CAPITAL LETTER Q

# R 82 0x52 LATIN CAPITAL LETTER R

# S 83 0x53 LATIN CAPITAL LETTER S

# T 84 0x54 LATIN CAPITAL LETTER T

# U 85 0x55 LATIN CAPITAL LETTER U

# V 86 0x56 LATIN CAPITAL LETTER V

# W 87 0x57 LATIN CAPITAL LETTER W

# X 88 0x58 LATIN CAPITAL LETTER X

# Y 89 0x59 LATIN CAPITAL LETTER Y

# Z 90 0x5a LATIN CAPITAL LETTER Z

# [ 91 0x5b LEFT SQUARE BRACKET

# \ 92 0x5c REVERSE SOLIDUS

# ] 93 0x5d RIGHT SQUARE BRACKET

# ^ 94 0x5e CIRCUMFLEX ACCENT

# _ 95 0x5f LOW LINE

# ` 96 0x60 GRAVE ACCENT

# a 97 0x61 LATIN SMALL LETTER A

# b 98 0x62 LATIN SMALL LETTER B

# c 99 0x63 LATIN SMALL LETTER C

# d 100 0x64 LATIN SMALL LETTER D

# e 101 0x65 LATIN SMALL LETTER E

# f 102 0x66 LATIN SMALL LETTER F

# g 103 0x67 LATIN SMALL LETTER G

# h 104 0x68 LATIN SMALL LETTER H

# i 105 0x69 LATIN SMALL LETTER I

# j 106 0x6a LATIN SMALL LETTER J

# k 107 0x6b LATIN SMALL LETTER K

# l 108 0x6c LATIN SMALL LETTER L

# m 109 0x6d LATIN SMALL LETTER M

# n 110 0x6e LATIN SMALL LETTER N

# o 111 0x6f LATIN SMALL LETTER O

# p 112 0x70 LATIN SMALL LETTER P

# q 113 0x71 LATIN SMALL LETTER Q

# r 114 0x72 LATIN SMALL LETTER R

# s 115 0x73 LATIN SMALL LETTER S

# t 116 0x74 LATIN SMALL LETTER T

# u 117 0x75 LATIN SMALL LETTER U

# v 118 0x76 LATIN SMALL LETTER V

# w 119 0x77 LATIN SMALL LETTER W

# x 120 0x78 LATIN SMALL LETTER X

# y 121 0x79 LATIN SMALL LETTER Y

# z 122 0x7a LATIN SMALL LETTER Z

# { 123 0x7b LEFT CURLY BRACKET

# | 124 0x7c VERTICAL LINE

# } 125 0x7d RIGHT CURLY BRACKET

# ~ 126 0x7e TILDE


EOF


갑자기 Unicode에 대해서 정리할 생각을 했는지 모르겠다. 머리속에 떠올라서 확인해 보니 한번도 정리를 해본적이 없는듯 하다.



<http://www.unicode.org/announcements/pr-3.0.html>

 

Unicode를 설명하기 위해서는 ISO의 UCS-4의 구조를 먼저 확인하는 것이 좋다.
(현재는 UCS-4나 UTF-32는 동일한 의미로 사용됩니다.)

UCS-4

ISO/IEC 10646에서 정의한 UCS-4는 4바이트로 구성되어 있습니다.
http://www.open-std.org/CEN/TC304/guidecharactersets/guideannexb.html#_Toc443308158
하위 2 바이트가 2^8(row)*2^8(cell)=2^16개의 code point를 지정하고 이것을 Plane이라고 합니다.
이 Plane 256개를 묶어서 하나의 Group을 구성하고 
이 Group 역시 이론상 256개가 존재할 수 있지만 127개만(즉 상위 1 bit은 사용하지 않음) 정의하여 사용하고 있다.

row = 256
cell = 256 
1 plane =  256*256 code points
1 group = 256 planes
UCS-4 = 128 groups


짐작하는 것처럼 하위 2바이트(row, cell)가 code point를 가르키고, 그 다음이 plane, 그 다음이 group을 가르킵니다.

| group | plane | row | cell |

<<https://docs.oracle.com/cd/E19455-01/806-5584/6jej8rb0n/index.html>>



Unicode

Unicode는 UCS-4의 0번 group만 사용하며 17개의 Plane을 정의합니다.

각 Plane들은 다음과 같이 명명되어 있습니다.

0: BMP: Basic Multilingual Plane

1: SMP, Supplementary Multilingual Plane

2: SIP, Supplementary Ideographic Plane, 표의문자 표시용

3~13: 사용하지 않음

14: SPP, Supplementary Special-purpose Plane

15~16: Supplementary Private Use Plane A/B


Code Point 영역에도 특별한 영역이 존재하는데 Encoding을 염두해 두고 확보해둔 Surrogates 영역(U+D800~U+DFFF)이 있다.

상위 부분을 "high surrogates" (D800–DBFF) 하위 부분을 "low surrogates" (DC00–DFFF)으로 나누고 2^20의 code point를 지정할 수 있다.

high surrogates 영역 D800–DBFF = 1024 = 2^10

low  surrogates 영역 DC00–DFFF = 1024 = 2^10

high * low = 2^10 * 2^10 = 2^20 code points 지정 가능


1~16 plane의 code point를 표시하는데 필요한 bit는 다음과 같이 20bit이므로

2^8*2^8 * (17-1) = 2^16 * 2^4 = 2^20


Surrogates pair를 통해서 1~16까지의 plane의 모든 code point를 지정 가능합니다.


Encoding and Surrogate pair

앞서 본봐야 같이 Unicode를 code point로 표현하기 위해서는 3바이트가 필요합니다.

Unicode나 UCS-4등에서 정의한 Code Point을 어떻게 표현할것인가는 또 다른 문제입니다.



UTF-8에서 Surrogates pair encoding과 관련한 문제점은 다음 글에 잘 나와 있다.

http://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.html#architecture

UTF-16과 UTF-8에서의 대행코드 인코딩에 관한 오해

본 절에서는 대행코드(Surrogates)를 이용하여 보충언어판 코드영역을 인코딩할 때 사람들이 종종 오해하는 부분에 대해서 설명하고자 합니다. 앞서 설명했듯이 UTF-16에서는 U+10000 ~ U+10FFFF까지의 코드를 인코딩하기 위하여 상위대행코드(high surrogate) 1개와 하위대행코드(low surrogate) 1개의 쌍으로 표현한다고 하였습니다. 그렇다면 UTF-8에서도 두개의 대행코드를 각각 3바이트씩으로 인코딩할 수 있을 것입니다(대행코드가 제안되었을 초기에 개발된 많은 프로그램들이 실제로 이렇게 구현했었다고 합니다).

이 방식이 제대로 동작할 수는 있지만 세가지 문제점이 있습니다. 첫째 문제점은 보충언어판의 모든 코드가 6바이트로 인코딩된다는 것입니다 - 정상적인 방법으로는 4바이트로 인코딩됩니다. 두번째는 인코딩된 문자열의 해석입니다. 보충언어판의 실제 코드 값은 U+10000 ~ U+10FFFF인데 대행코드를 UTF-8 인코딩에 이용하게 되면, 두개의 대행코드로부터 실제 코드값으로 다시 계산해주어야 하는 번거로움이 있습니다. 세째, 텍스트 인코딩의 안정성이 떨어진다는 것입니다. 세 바이트로 인코딩된 상위대행코드가 나타나면 그 다음에는 반드시 하위대행코드가 따라와야 하므로, 정상적인 방법에 비해 오류가 발생할 위험성이 그만큼 더 커진다는 것이죠.

이러한 문제점들 때문에 UTF-8에서는 대행코드 자체를 "절대로" 인코딩하지 않습니다. 그래서 대행코드영역의 byte sequence를 보면 ill-formed라고 나타내고 있습니다. 또한 대행코드를 인코딩한 것을 사용하게 되면 17개의 언어판 밖에는 표현할 수 없다는 단점도 가지게 될 것입니다. 이러저러한 이유로 UTF-8은 규칙에 따라 순서대로 코드값을 인코딩합니다. 따라서 대행코드영역(Surrogates)은 UTF-16 인코딩에서만 됩니다.

UTF-8 encoding에서는 Surrogates pair code point를 encoding하지 않고 Surrogate Pair가 가르키는 code point를 encoding해야 한다. 결국 4바이트 스트림이 생성되어야 한다.

https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points

Since RFC 3629 (November 2003), the high and low surrogate halves used by UTF-16 (U+D800 through U+DFFF) and code points not encodable by UTF-16 (those after U+10FFFF) are not legal Unicode values, and their UTF-8 encoding must be treated as an invalid byte sequence.

1~16번에 해당하는 Supplementary Planes을 사용하는 code point를 encoding하게 위해서는 UTF-16이 표준이며, UTF-16 에서 Supplementary Planes의 code point 는 다음과 같이 encoding된다.

CharacterSurrogate pair
U+10000{U+D800, U+DC00}
U+10E6D{U+D803, U+DE6D}
U+1D11E{U+D834, U+DD1E}
U+10FFFF{U+DBFF, U+DFFF}

또한 Surrogate Pair에서 Code Point 계산하는 방법은 다음과 같다

U = (CH – D80016) * 40016 + (CL – DC0016) + 1000016

Happy Coding~:)

+ Recent posts