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로 설정하겠다는 뜻