Unicode와 UTF-8

Unicode는 세상에 존재하는 모든 문자들을 하나의 거대한 표에 모두 담고 있는 문자 인코딩 방식이다. 그리고, UTF-8은 모든 문자들을 표현할 수 있는 가변길이 문자 인코딩 방식 중 하나이다. UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 최소 1바이트에서 최대 4바이트까지를 사용한다. 만약 ASCII 문자들이라면 UTF-8에서는 1바이트만으로 표현될 것이다.


문자 표현의 세가지 방식

  • ASCII
    - 문자를 8 bit로 표현
    - 영어만 다룰 수 있음 (한글을 비롯한 여러 국가의 언어는 표현하지 못함)
  • Multi-byte character set
    - 첫바이트에서 비영어 확장 세트를 정의(0x80~0xff), 그 다음 바이트에서 해당 문자를 표현
    - 영어는 Ascii 처럼 한 바이트(8 bit)로 표현
    - 0x80~0xff 사이의 바이트 값이 나타나면 비영어권 언어라는 것을 알 수 있고, 다음 바이트를 읽어 문자를 표현
    - 한글과 영어를 혼합해서 쓸 수는 있지만, 한글과 그리스어와는 혼합해서 쓸 수 없음 (글자가 깨짐). 같은 바이트 값을 공유하기 때문이다.
  • Unicode
    - 세상의 모든 문자를 하나의 거대한 표에 모두 담아 문자 코딩 충돌없이 여러 언어를 함께 표현할 수 있음


파이썬에서의 문자 인코딩

한글을 byte code로 저장하고자 한다면

a = "한글"

이라고 하면 된다. 변수 a는 시스템 default encoding 방식대로 인코딩된다.

(윈도우즈: cp949 / 맥: utf-8 / 리눅스: utf-8)

한글을 unicode로 저장하고자 한다면

a = u"한글"

로 사용하면 된다. 그리고

print(a)

라고 하면, 알아서 시스템 default encoding 방식대로 decoding하여 출력한다.



문자 인코딩 변환 Unicode ↔ UTF-8

Unicode → UTF-8 방식의 byte code:

utf8_byte_string = unicode_string.encode("utf-8")

UTF-8 방식의 byte code → Unicode:

unicode_string = utf8_byte_string.decode("utf-8")
unicode_string = unicode(utf8_byte_string, "utf-8")


인코딩 변환 예제

>>> unicode_string = u"한글"
>>> unicode_string
u'\xc7\xd1\xb1\xdb'
>>> utf8_byte_string = unicode_string.encode("utf-8")
>>> utf8_byte_string
'\xc3\x87\xc3\x91\xc2\xb1\xc3\x9b'
>>> unicode_string = utf8_byte_string.decode("utf-8")
>>> unicode_string
u'\xc7\xd1\xb1\xdb'
>>> unicode_string2 = utf8_byte_string.decode("utf-8")
>>> unicode_string2
u'\xc7\xd1\xb1\xdb'
>>> 



윈도우즈에서 문자 인코딩 변환 Unicode ↔ str

Unicode → str(윈도우즈):

string = unicode_string.encode("cp949")

str(윈도우즈) → Unicode:

unicode_string = string.decode("cp949")
unicode_string = unicode(string, "cp949")


인코딩 변환 예제

>>> string = "한글"
>>> string
'\xc7\xd1\xb1\xdb'
>>> type(string)
<type 'str'>
>>> unicode_string = string.decode("cp949")
>>> unicode_string
u'\ud55c\uae00'
>>> type(unicode_string)
<type 'unicode'>
>>> string = unicode_string.encode("cp949")
>>> string
'\xc7\xd1\xb1\xdb'
>>> type(string)
<type 'str'>
>>> 



기타 예제 코드

Unicode 문자열이 한글인지 판단하는 코드:

def isKorean(word):
    if len(word) <= 0:
        return False
    # UNICODE RANGE OF KOREAN: 0xAC00 ~ 0xD7A3
    for c in range(len(word)):
        if word[c] < u"\uac00" or word[c] > u"\ud7a3":
            return False
    return True



#-*- coding: utf-8 -*-

(영문이 아닌) 한글을 비롯한 다른 언어들에 대해서는 기본 인코딩 방식을 utf-8로 설정하겠다는 뜻



References