파이썬 2와 유니코드 코드베이직 © 2015
이성주 대표
문제
출력 문자열 깨짐
$ python my_scirpt.py
안녕, 세계!
?ȳ?, ????!
파일 내용 깨짐
2
인코딩
틀린 인코딩 올바른 인코딩
3
유니코드와 인코딩
유니코드에 대한 잦은 오해 또는 인상
 UTF-8은 유니코드다 (땡!)
 유니코드는 16 비트로 저장된다. (땡!)
 파일에서 인코딩 정보를 알아낼 수 있다. (거의 땡!)
 유니코드는 … 짜증난다 (딩동댕?)
 하지만 구글도 유니코드와 UTF-8 용어를 혼동했다.
4
MOVING TO UNICODE 5.1
“웹페이지는 ASCII, Latin-1, Windows 1252, 또는
유니코드와 같이 다양한 문자 인코딩을 사용한다.”
– Moving to Unicode 5.1, Google 공식 블로그, 2008
 유니코드와 UTF-8은 같은 것이 아니다.
5
유니코드는 추상화된 문자
유니코드 ~ 음식 인코딩 ~ 그릇
6
유니코드는 추상화된 문자
유니코드 ~ 문자
알파벳이라는 문자
인코딩 ~ 글자체
7
CODE POINTS
8
UNICODE ~1백만
ASCII 128
그 밖의 모든 문자
UNICODE CODE POINTS
9
인코딩
문제점
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
ASCII
11
ASCII
0 127
UTF-8 : UNICODE = 1:1
12
ASCII
0 127
UNICODE
0 1,112,064
10FFFF
UTF-8, 가변 길이
13
P
0 127
파
00FFFF
유니코드 인코딩
코드 범위 (16진수) UTF-8 UTF-16 UTF-32
000000 –
00007F
1
2
4
000080 –
00009F
2
0000A0 –
0003FF
000400 –
0007FF
000800 – 003FFF
3
004000 – 00FFFF
010000 – 03FFFF
4 4
040000 – 10FFFF 14
UTF-8
ASCII 호환
웹문서 84% (2015-07)
대부분의 리눅스 시스템의
기본 인코딩
15
UTF-16
여러 운영체제 내부의 기본 인코딩
• Windows
•Mac OS X
16
파이썬 2 문자열과
유니코드
17
파이썬 2 문자열의 문제점
ASCII 문자
>>> print(‘python’[0])
p
>>> print(‘python’[:3])
pyt
비 ASCII 문자
>>> print(‘파이썬’[0])
?
>>> print(‘파이썬' [:3])
파
18
파이썬 2 기본 인코딩 ASCII
$ python hello_world.py
SyntaxError: Non-ASCII
character
hello_world.py
print(‘안녕, 세계!’)
19
파이썬 2 스크립트 인코딩
$ python hello_world.py
안녕, 세계!
hello_world.py
# coding: utf-8
print(‘안녕, 세계!’)
20
파이썬 2 STR의 문제점
UTF-8 인코딩
>>> sys.stdout.encoding
‘UTF-8’
>>> ‘안녕’
'xecx95x88xebx85x
95'
CP949 인코딩
>>> sys.stdout.encoding
‘cp949’
>>> ‘안녕’
'xbexc8xb3xe7'
21
파이썬2의 두 가지 문자열
형식
<type 'basestring'>
|
+--<type 'str'>
|
+--<type 'unicode'>
>>> type(‘안녕’)
<type ‘str’>
>>> type(u’안녕’)
<type ‘unicode’>
22
파이썬 2 유니코드 인코딩
UnicodeEncodeError: 'ascii' codec can't encode character
>>> import sys
>>> sys.getdefaultencoding()
‘ascii’
>>> sys.stdout.encoding
‘UTF-8’
>>> print(u’안녕, 세계!’)
안녕, 세계!
23
유니코드 인코딩과 디코딩
인코딩
u.encode(encoding)
<type ‘unicode’> to <type
‘str’>
유니코드 형식의 문자열을
지정된 인코딩을 사용하여 str
형식으로 변환
디코딩
s.decode(encoding)
<type ‘str’> to <type
‘unicode’>
특정한 인코딩으로 ‘str’을
읽어들여 유니코드 형식으로
변환
24
고민해결?!
sys.setdefaultencoding(‘utf
-8’)
다른 파이썬 환경에서는
동작하지 않는다
여러 가지 안 되는 이유를 죽
나열해야 하니 결론은 …
‘아니오’
25
유니코드 원칙
1. 초반 디코드
2. 유니코드로 통일
3. 막판 인코딩
26
초반 디코드  유니코드
가능한 빨리 <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
출력 시, 유니코드  인코딩
직접 변환
>>> 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

파이썬 2와 유니코드