수색…


통사론

  • 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'&#163;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")


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow