2. 발표자 소개 - 강대성
컴퓨터 전공, 경제 부전공
게임회사 3년 - MMORPG 서버 개발
통신회사 2년 - 인사 관리 시스템
금융회사 6년 - 해외선물, FX거래 시스템
록앤올(김기사) 2년 - 교통정보 분석, 미래 속도 예측
피플펀드컴퍼니 2015.09 ~ - 기술총괄
현)대한아이스하키협회 심판 2007~
20. H i 똠 방 각 하
ASCII 0x48 0x69
EBCDIC 0xC8 0x89
EUC_KR 0x48 0x69
0xA4D4A4A8
A4C7A4B1
채움/ㄸ/ㅗ/ㅁ
0xB9E6 0xB0A2 0xC7CF
CP949 0x48 0x69 0x8C63 0xB9E6 0xB0A2 0xC7CF
Unicode U+48 U+69 U+B620 U+BC29 U+AC01 U+D558
UTF-8 0x48 0x69 0xEB98A0 0xEBB0A9 0xEAB081 0xED9598
UTF-16BE 0x0048 0x0069 0xB620 0xBC29 0xAC01 0xD558
UTF-16LE 0x4800 0x6900 0x20B6 0x29BC 0x01AC 0x58D5
같은 문자라도 인코딩에 따라
다르게 부호화 되고,
일부는 표현이 불가능하다.
21. 동일한 내용을 Encoding에 따라 해석
0x50 0x79 0x43 0x6F 0x6E 0x2E 0x4B 0x52
ASCII P y C o n . K R
UTF-8 P y C o n . K R
UTF-16BE 偹 䍯 渮 䭒
UTF-16LE 祐 潃 (not valid) 剋
부호를 어떤 인코딩으로
해석을 했냐에 따라 다르게 해석된다.
24. Unicode
전세계 문자, 기호를 Codepoint에 매칭.
한글, 타이문자
많이 쓰이는 이모티콘도 정의
ex) Pile of Poo(U+1F4A9, )
CodePoint :
U+로 표현. ASCII영역은 U+0000~U+007F
한글 : 초성/중성/종성, 자음/모음, 완성글자 영역이 있음.
25. Unicode != UTF-8
U+AC15 != 0xEA B0 90
Unicode : 문자를 CodePoint에 매칭시킴 일반적으로 전송&저장을 위해 사용하지 않음.
UTF-8 : Unicode의 전송&저장을 위한 인코딩 방법
26. 왜 UTF-8?
1. 모든 Unicode Codepoint 를 다룰 수 있다.
2. Unicode를 Encoding했을 때 NULL 이 포함되지 않음.
C에서 strcpy()를 사용할 수 있음.
3. ASCII text는 UTF-8 text가 될 수 있음.
4. 주요한 문자들은 1~2bytes로 표현가능. (한글은 3 bytes)
5. 일부 바이트가 유실되어도, 다음 시작 byte를 알아낼 수 있다.
https://docs.python.org/3/howto/unicode.html
38. 간단한 연습
유럽 여행을 함께 하기로 한 친구 4명이 각각 좋아하는 여행지와
소요 예산을 text 문서로 저에게 전달해주었습니다. 이것을 하나의
파일로 합치면서 정렬하기
1.csv
나폴리, 3일, EUR 500
2.csv
München, 2Days, €400
3.csv
로마, 4일, 300유로
4.csv
London, 3D, £300
39. Python3 Code
filenames = ['1.csv','2.csv','3.csv','4.csv']
datas = []
for filename in filenames:
f = open( filename, mode='rb' )
datas.append( f.read() )
f.close()
datas.sort()
f_write = open( 'summary.csv', mode='wb' )
for data in datas:
f_write.write(data)
f_write.close()
51. Standard Output Encoding in Python2
> cat encodingtest.py
# -*- coding: UTF-8 -*-
import sys
print 'Standard output encoding is', sys.stdout.encoding
print u'Test #1 ', u'PyCon 2015'
print u'Test #2 ', u'강대성'
> python encodingtest.py
Standard output encoding is UTF-8
Test #1 PyCon 2015
Test #2 강대성
Encoding is UTF-8
= Terminal Encoding
52. > python encodingtest.py > output.txt
Traceback (most recent call last):
File "encodingtest.py", line 6, in <module>
print u'Test #2 ', u'강대성'
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2:
ordinal not in range(128)
> cat output.txt
Standard output encoding is None
Test #1 PyCon 2015
Test #2
Redirect stdout
Encoding is None
= sys.stdout.encoding
53. Process를 실행하면 3개의 파일이 open 됨
0(Standard Input),
1(Standard Output),
2(Standard Error)
run “python”
pi@raspberrypi /proc/11568/fd $ ls -l
lrwx------ 1 pi pi 64 Aug 23 15:46 0 -> /dev/pts/1
lrwx------ 1 pi pi 64 Aug 23 15:46 1 -> /dev/pts/1
lrwx------ 1 pi pi 64 Aug 23 15:46 2 -> /dev/pts/1
/proc/processnumber/fd
Linux 시스템에서 각 프로
세스들의 열린 파일들을
볼 수 있음.
54. Redirect 하면...?
run “python > test.output”
pi@raspberrypi /proc/11588/fd $ ls -l
lrwx------ 1 pi pi 64 Aug 23 15:56 0 -> /dev/pts/1
l-wx------ 1 pi pi 64 Aug 23 15:56 1 -> /home/pi/test.output
lrwx------ 1 pi pi 64 Aug 23 15:56 2 -> /dev/pts/1
output을 redirect하면
standard output 이
/home/pi/test.output으로 지
정됨.
55. 터미널 vs 파일
print 'Standard output encoding is', sys.stdout.encoding
터미널 :
Standard output encoding is UTF-8
Standard output encoding is EUC-KR
파일 :
Standard output encoding is None
60. 설명에 따르면...
Encoding 을 알려주지 않고.
83년버전 JIS 한자 코드와 76년 버전 JIS 코드 혼재
한자 문자열 중에 1byte계 문자가 혼재함
(이런 설명이 쭉 이어짐…)
MS 일본에 있는 친구에게 물어봐도 모르겠다고 함.
61. 일단 알고 있는 모든 Encoding을 시도
print 'Detect :', chardet.detect(readdata)
print 'Received data :', readdata, ':'.join(x.encode('hex') for x readdata
print
ENCODINGS = ['ISO-2022-JP', 'UTF-8', 'EUC-JP', 'SJIS']
for ENCODING in ENCODINGS:
print ENCODING, codecs.decode( readdata, ENCODING )
Detect : {'confidence': 1.0, 'encoding': 'ascii'}
Received data : 5:j@>#I#C 35:5c:3a:6a:40:3e:23:49:23:43
ISO-2022-JP : 5:j@>#I#C
UTF-8 : 5:j@>#I#C
EUC-JP : 5:j@>#I#C
SJIS : 5:j@>#I#C
디코딩이 제대로 안되었다.
62. Tip #2 : 인코딩 파악
주고 받을 인코딩을 정확히 파악!
정의된 문서도 보고,
주고 받은 내용을 직접 보고,
테스트!
63. 인코딩에서 어려움을 가지는 사람들...
“ Encode, Decode 이렇게 저렇게 해보다가,
잘 되면 그것을 써요. ”
망하는 지름길
67. ISO-2022-JP
ESC $ B 를 추가.
ENCODING = 'ISO-2022-JP'
ESCseq = ‘x1b$B’
print ENCODING, codecs.decode( ESCseq + readdata, ENCODING )
결과
ISO-2022-JP 宮崎西IC
성공
68. 인코딩 파악을 위한 순서
1. 문서 또는 서로의 약속을 확인
2. 전송 받은 데이터를 열어서 확인
( 다음장에서 상세 설명 )
3. 테스트
69. 인코딩을 확인 & 파악
vi ( :r !xxd filename ) or 16진수 지원 Editor
':'.join(x.encode('hex') for x readdata
example)
50 79 43 6F 6E EA B0 95
EB 8C 80 EC 84 B1
UTF-8 느낌
72. 테스트
전체 프로그램으로 테스트 하면 시간이 오래 걸릴 수 있으니,
해당 부분만 따로 떼어서 테스트 해본다.
ENCODING = 'ISO-2022-JP'
ESCseq = ‘x1b$B’
print ENCODING, codecs.decode( ESCseq + readdata, ENCODING )
결과
ISO-2022-JP 宮崎西IC
81. 파일 IO를 위한 TIP
파일을 열 때 codecs 쓰면 간단해짐.
fp = codecs.open('testfile.txt', encoding='UTF-16LE', ...)
Python3에는 내장함수에서 가능
fp = open( encoding = ‘UTF-8’, ... )
82.
83. 출력가능한 ASCII는 그대로
나머지는 8bit를 “=XX”으로 표
시
0xC3BC
CP1252 = ü
UTF-8 = ü
표시하려고 했던 단어 für
하지만 für
0xEFBBBF
이건 UTF-8 BOM 같은데...
84. 정리 : 이것만은 기억하세요.
Tip #1 : Unicode Sandwich
Python에선 항상 Unicode
Tip #2 : 인코딩 파악하기
문서보고, 확인하고, 테스트
주어야하는 인코딩도 명확히