4. 유니코드와 인코딩
유니코드에 대한 잦은 오해 또는 인상
UTF-8은 유니코드다 (땡!)
유니코드는 16 비트로 저장된다. (땡!)
파일에서 인코딩 정보를 알아낼 수 있다. (거의 땡!)
유니코드는 … 짜증난다 (딩동댕?)
하지만 구글도 유니코드와 UTF-8 용어를 혼동했다.
4
5. MOVING TO UNICODE 5.1
“웹페이지는 ASCII, Latin-1, Windows 1252, 또는
유니코드와 같이 다양한 문자 인코딩을 사용한다.”
– Moving to Unicode 5.1, Google 공식 블로그, 2008
유니코드와 UTF-8은 같은 것이 아니다.
5
10. 인코딩
문제점
1. 프로세서마다 바이트 순서가 다르다
2. 낭비되는 공간이 많다. 디스크 저장 공간과 네트워크
대역폭이 최대 4배까지 늘어난다.
3. C 함수 strlen()과 호환되지 않는다.
4. 인터넷 표준 상당수는 0 바이트가 삽입된 값을 상대할 수
없다.
10
P
0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00
y t h o n
24. 유니코드 인코딩과 디코딩
인코딩
u.encode(encoding)
<type ‘unicode’> to <type
‘str’>
유니코드 형식의 문자열을
지정된 인코딩을 사용하여 str
형식으로 변환
디코딩
s.decode(encoding)
<type ‘str’> to <type
‘unicode’>
특정한 인코딩으로 ‘str’을
읽어들여 유니코드 형식으로
변환
24
27. 초반 디코드 유니코드
가능한 빨리 <type ‘unicode’>로 변환
def to_unicode(obj, encoding=‘utf-8):
if isinstance(obj, basestring):
if not isinstance(obj, unicode):
obj = unicode(obj, encoding)
return obj
27
28. 출력 시, 유니코드 인코딩
직접 변환
>>> f = open(‘text.txt’, ‘w’)
>>>
f.write(uni_str.encode(‘utf-
8’))
>>> f.close()
codecs 표준 라이브러리
>>> import codecs
>>> f =
codecs.open(‘text.txt’, ‘w’,
encoding=‘utf-8’)
>>> f.write(uni_str)
>>> f.close()
28