유니코드 개요

  • 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