Python Language
유니 코드와 바이트
수색…
통사론
- str.encode (인코딩, 오류 = '엄격')
- bytes.decode (인코딩, 오류 = '엄격')
- open (파일명, 모드, 인코딩 = 없음)
매개 변수
매개 변수 | 세부 |
---|---|
부호화 | 사용할 인코딩 (예 : 'ascii' , 'utf8' 등) ... |
오류 | 오류 모드, 예를 들어 'replace' 는 잘못된 문자를 물음표로 대체하고 'ignore' 는 잘못된 문자 등을 무시합니다. |
기초
Python 3에서 str
은 유니 코드 사용 가능 문자열 유형이고 bytes
는 원시 바이트 시퀀스 유형입니다.
type("f") == type(u"f") # True, <class 'str'>
type(b"f") # <class 'bytes'>
파이썬 2 에서 임시 문자열은 기본적으로 원시 바이트 시퀀스 였고 유니 코드 문자열은 "u"접두사가있는 모든 문자열이었습니다.
type("f") == type(b"f") # True, <type 'str'>
type(u"f") # <type 'unicode'>
유니 코드를 바이트로
유니 코드 문자열은 .encode(encoding)
로 바이트로 변환 될 수 있습니다.
파이썬 3
>>> "£13.55".encode('utf8')
b'\xc2\xa313.55'
>>> "£13.55".encode('utf16')
b'\xff\xfe\xa3\x001\x003\x00.\x005\x005\x00'
파이썬 2
py2에서 기본 콘솔 인코딩은 sys.getdefaultencoding() == 'ascii'
에서와 같이 sys.getdefaultencoding() == 'ascii'
이고 utf-8
이 아니므로 이전 예제에서와 같이 직접 인쇄 할 수는 없습니다.
>>> print type(u"£13.55".encode('utf8'))
<type 'str'>
>>> print u"£13.55".encode('utf8')
SyntaxError: Non-ASCII character '\xc2' in...
# with encoding set inside a file
# -*- coding: utf-8 -*-
>>> print u"£13.55".encode('utf8')
£13.55
인코딩이 문자열을 처리 할 수 없다면,`UnicodeEncodeError`가 발생합니다 :
>>> "£13.55".encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 0: ordinal not in range(128)
유니 코드 할 바이트 수
바이트는 .decode(encoding)
사용하여 유니 코드 문자열로 변환 할 수 있습니다.
바이트의 순서는 적절한 인코딩을 통해서만 유니 코드 문자열로 변환 될 수 있습니다!
>>> b'\xc2\xa313.55'.decode('utf8')
'£13.55'
인코딩이 문자열을 처리 할 수없는 경우 UnicodeDecodeError
가 발생합니다.
>>> b'\xc2\xa313.55'.decode('utf16')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/csaftoiu/csaftoiu-github/yahoo-groups-backup/.virtualenv/bin/../lib/python3.5/encodings/utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x35 in position 6: truncated data
인코딩 / 디코딩 오류 처리
.encode
및 .decode
에는 모두 오류 모드가 있습니다.
기본값은 'strict'
이며 오류시 예외를 발생시킵니다. 다른 모드는 더 관대합니다.
부호화
>>> "£13.55".encode('ascii', errors='replace')
b'?13.55'
>>> "£13.55".encode('ascii', errors='ignore')
b'13.55'
>>> "£13.55".encode('ascii', errors='namereplace')
b'\\N{POUND SIGN}13.55'
>>> "£13.55".encode('ascii', errors='xmlcharrefreplace')
b'£13.55'
>>> "£13.55".encode('ascii', errors='backslashreplace')
b'\\xa313.55'
디코딩
>>> b = "£13.55".encode('utf8')
>>> b.decode('ascii', errors='replace')
'��13.55'
>>> b.decode('ascii', errors='ignore')
'13.55'
>>> b.decode('ascii', errors='backslashreplace')
'\\xc2\\xa313.55'
사기
유니 코드와 바이트를 다룰 때 엔코 드를 똑바로 유지하는 것이 중요합니다.
파일 I / O
비 - 바이너리 모드 (예 : 'r'
또는 'w'
)로 열린 파일은 문자열을 처리합니다. 디프테리아 인코딩은 'utf8'
입니다.
open(fn, mode='r') # opens file for reading in utf8
open(fn, mode='r', encoding='utf16') # opens file for reading utf16
# ERROR: cannot write bytes when a string is expected:
open("foo.txt", "w").write(b"foo")
바이너리 모드 (예 : 'rb'
또는 'wb'
)로 열린 파일은 바이트를 처리합니다. 인코딩이 없으므로 인코딩 인수를 지정할 수 없습니다.
open(fn, mode='wb') # open file for writing bytes
# ERROR: cannot write string when bytes is expected:
open(fn, mode='wb').write("hi")