파이썬 2와 유니코드

7,494 views

Published on

Published in: Technology
4 Comments
40 Likes
Statistics
Notes
  • @Jae Won Seo 참고가 되셨다니 기쁩니다. 이전 내용을 다듬어 좀더 잘 준비해 보았습니다.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • @undefined 참고가 되셨다니 기쁩니다.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 현재 개발중인 프로그램 작성에 큰 도움이 되었습니다.
    감사합니다.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 세미나에는 못 갔지만... 발표자료 15p에 언급하신 codecs에 버그가 있습니다. linux에서는 잘 동작하는데, windows 상에서 python 2.7.x 버전에서 버그가 있어서, 아래 링크와 깉이 수동으로 처리해줘야 합니다. ㅠㅜ; 참고하세요.. .
    http://stackoverflow.com/questions/5941988/print-to-utf-8-encoded-file-with-platform-dependent-newlines
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
7,494
On SlideShare
0
From Embeds
0
Number of Embeds
1,629
Actions
Shares
0
Downloads
78
Comments
4
Likes
40
Embeds 0
No embeds

No notes for slide

파이썬 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

×