Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

파이썬 2와 유니코드

10,920 views

Published on

Published in: Technology

파이썬 2와 유니코드

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

×