SlideShare a Scribd company logo
1 of 28
파이썬 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

More Related Content

What's hot

파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장SeongHyun Ahn
 
[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)NAVER D2
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Insuk (Chris) Cho
 
Go character encoding
Go character encodingGo character encoding
Go character encodingHomin Lee
 
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보Young Hoo Kim
 
Windows reversing study_basic_4
Windows reversing study_basic_4Windows reversing study_basic_4
Windows reversing study_basic_4Jinkyoung Kim
 
모두의 JIT 컴파일러
모두의 JIT 컴파일러모두의 JIT 컴파일러
모두의 JIT 컴파일러우경 성
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의Kwangyoun Jung
 
Pwnable study basic_2
Pwnable study basic_2Pwnable study basic_2
Pwnable study basic_2Jinkyoung Kim
 
Web hacking introduction
Web hacking introductionWeb hacking introduction
Web hacking introductionJinkyoung Kim
 
파이썬을 배워야하는 이유 발표자료 - 김연수
파이썬을 배워야하는 이유 발표자료 - 김연수파이썬을 배워야하는 이유 발표자료 - 김연수
파이썬을 배워야하는 이유 발표자료 - 김연수Yeon Soo Kim
 
Linux reversing study_basic_2
Linux reversing study_basic_2Linux reversing study_basic_2
Linux reversing study_basic_2Jinkyoung Kim
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)Tae Young Lee
 
Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해용 최
 
알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기Han Lee
 

What's hot (20)

파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
파이썬 소개
파이썬 소개 파이썬 소개
파이썬 소개
 
[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
Go character encoding
Go character encodingGo character encoding
Go character encoding
 
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
 
Windows reversing study_basic_4
Windows reversing study_basic_4Windows reversing study_basic_4
Windows reversing study_basic_4
 
모두의 JIT 컴파일러
모두의 JIT 컴파일러모두의 JIT 컴파일러
모두의 JIT 컴파일러
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 
System+os study 1
System+os study 1System+os study 1
System+os study 1
 
Pwnable study basic_2
Pwnable study basic_2Pwnable study basic_2
Pwnable study basic_2
 
Web hacking introduction
Web hacking introductionWeb hacking introduction
Web hacking introduction
 
Python - Module
Python - ModulePython - Module
Python - Module
 
파이썬을 배워야하는 이유 발표자료 - 김연수
파이썬을 배워야하는 이유 발표자료 - 김연수파이썬을 배워야하는 이유 발표자료 - 김연수
파이썬을 배워야하는 이유 발표자료 - 김연수
 
Linux reversing study_basic_2
Linux reversing study_basic_2Linux reversing study_basic_2
Linux reversing study_basic_2
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
 
Python basic
Python basicPython basic
Python basic
 
Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해
 
알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기
 

Viewers also liked

파이썬 유니코드 이해하기
파이썬 유니코드 이해하기파이썬 유니코드 이해하기
파이썬 유니코드 이해하기Yong Joon Moon
 
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기Ryan Park
 
프로그래밍 발전구조도
프로그래밍 발전구조도프로그래밍 발전구조도
프로그래밍 발전구조도성주 이
 
Inc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipInc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipsweetchip
 
Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법pyrasis
 
Generative adversarial networks
Generative adversarial networksGenerative adversarial networks
Generative adversarial networks남주 김
 

Viewers also liked (8)

파이썬 유니코드 이해하기
파이썬 유니코드 이해하기파이썬 유니코드 이해하기
파이썬 유니코드 이해하기
 
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기
 
프로그래밍 발전구조도
프로그래밍 발전구조도프로그래밍 발전구조도
프로그래밍 발전구조도
 
Unicode
UnicodeUnicode
Unicode
 
Inc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipInc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchip
 
파이썬 심화
파이썬 심화파이썬 심화
파이썬 심화
 
Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법
 
Generative adversarial networks
Generative adversarial networksGenerative adversarial networks
Generative adversarial networks
 

파이썬 2와 유니코드