유니코드 개요
- 4바이트로 세상의 모든 글자를 할당한 코드 체계이다.
- 4바이트(32비트)이기 때문에 2의 32승개의 코드를 표현할 수 있다. 즉 약 42억자를 표현할 수 있는 것이다.
- 16진수로 표현하면
0x0000 0000
부터0xFFFF FFFF
까지의 숫자로 표현된다. - 17개의 플레인(문자 평면)으로 나뉘어져 있다. 기본 다국어 평면(BMP), 보조 다국어 평면(SMP)와 같은 식이다.
- 대부분의 문자체계가 기본 다국어 평면(BMP, 0번 평면)에 들어가 있다. 이 평면의 범위는
0x0000
부터0xFFFF
까지이다. (10진수로는 0부터65535까지) - 이모지등은 보조 다국어 평면(SMP, 1번 평면)에 들어가 있다. 이 평면의 범위는
0x10000
부터0x1FFFF
까지이다. (10진수로는 65536부터 131071까지) - 전체적으로 보면 아직도 60%이상 공간이 남아있다. 널널하다.
- 현재도 계속 추가가 되고 있다. 2024년 3월 기준 최신버전은 현재 최신 버전은 2023년 9월 12일에 발표된 15.1이다.
표기 형식
- 주로
U+{16진수숫자 네자리}
형식을 가진다. (0번 평면에 대부분의 문자가 들어가 있기 때문에 16진수 숫자 네자리(2바이트)로 표현가능하다.) - 예를 들어
U+AC00
는 한글가
를 의미한다. 0x
로 표기하는 경우도 있다. 숫자자체는 동일하게 16진수 체계의 숫자이다.- 주로 자바 코드에서 보이는데
\u
로 표현하는 경우도 있다.U+
과 의미는 동일하다. 유니코드 넘버를 가리킨다.
UTF-8 인코딩
- 유니코드 자체는 전 세계의 유일한 글자에 숫자를 배상하는 방식(규격)이다.
- 인코딩은 그 규격을 저장하는 방식으로 여러 방식이 있다.
- 유니코드는 문자 하나를 4바이트로 표현하므로 이 것을 그대로 사용하면 기존 ASCII방식에 비해 필요 용량이 4배가 되어 버린다.
- 인코딩 방식중에 가장 많이 쓰이는 것은 가변길이 인코딩인
UTF-8
방식이다.
바이트에 따른 표현범위
출처: https://en.wikipedia.org/wiki/UTF-8
UTF-8
를 사용하면 자주 쓰이는 문자 테이블은 1바이트로, 한글은 3바이트로 표현할 수 있다.- 특정 영역을 넘어서면 1바이트에서 2바이트로, 2바이트로 표현가능한 영역을 넘어서면 3바이트로 가변적으로 변한다.
- 유니코드 0번플레인인 0xFFFF 까지는 1바이트에서 3바이트로 표현되고, 에모지나 한자등을 포함하는 그 이후 플레인인 1번부터 17번까지(0x010000~0x10FFFF)는 4바이트로 표현된다.
유니코드를 문자로 변환하는 코드
파이썬으로 유니코드를 문자로 변환하는 코드를 정리해둔다.
import codecs
def get_unicode_number_of(str):
# ord(str)함수는 파라메터로 유니코드 문자열을 받아서 유니코드 포인트번호를 돌려준다.
# 하나의 캐릭터만 넣을 수 있다. ex) ord('한') -> 54620
return ord(str)
def get_str_of(unicode_number):
# unicode_number는 10진후 혹은 16진수의 유니코드 번호다.
# 54620, 0xd55c, ud55c
# 유니코드 포인트 번호는 chr함수로 스트링으로 변환할 수 있다. ex) chr(54620) -> '한'
# 그리고 유니코드 포인트 번호는 hex()함수를 써서 16진수로 표현할 수 있다. ex) hex(54620) -> 0xd55c
# chr()함수는 유니코드 번호를 16진수 인수로 받을 수도 있다. ex) chr(0xd55c) -> '한'
return chr(unicode_number)
def get_utf8_bytes_of(utf8_str):
# 문자열을 바이트 배열로 변환해준다.
return str.encode(utf8_str)
def get_str_of_utf8_bytes(b_str):
# 바이트 배열을 문자열로 변환해준다.
return codecs.decode(b_str, 'utf-8')
def main():
print(get_unicode_number_of('한')) # 45620
print(get_str_of(54620)) # 한
print(get_str_of(0xd55c)) # 한
print(get_utf8_bytes_of('한')) # b'\xed\x95\x9c'
print(get_utf8_bytes_of('\ud55c')) # b'\xed\x95\x9c'
print(get_str_of_utf8_bytes(b'\xed\x95\x9c')) # 한
print('\ud55c') # \u표기(유니코드번호)를 사용해서 출력할 수 있다. '한'이 출력된다.
print('\u0007') # Alert 기호. 터미널에서는 출력되지 않는다.
if __name__ == '__main__':
main()
참고
- 나무위키 유니코드: https://namu.wiki/w/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
- 위키피디아 UTF-8: https://en.wikipedia.org/wiki/UTF-8