인코딩/디코딩 문제 이해하기

매일 공부(ML)·2022년 11월 21일
0

Fluent Python

목록 보기
22/130

텍스트와 바이트

인코딩/디코딩 문제 이해하기

UnicodeError라는 범용 에러가 있고, 거의 항상 UnicodeEncodeError(str을 이진 시퀀스로 반환) 혹은 UnicodeDecodeError(이진 시퀀스를 str로 읽어 들일 때)같은 구체적인 에러가 발생하고, 파이썬 모듈을 로딩할 때 소스 코드가 예기치 않은 방식으로 인코딩되어 있을 경우 SyntaxError가 발생하기도 한다.

UnicodeEncodeError 처리하기

대부분 비UTF 코덱은 유니코드 문자의 ㄹ부만 처리할 수 있고 텍스트를 바이트로 변환할 때 문자가 대상 인코딩에 정의되지 않을 경우, 인코딩 메서드나 함수의 errors 인수에 별도의 처리기를 지정하지 않는 한 UnicodeEncodeError가 발생한다.

#바이트로 인코딩하기: 성공 및 에러 처리

city = 'Sao Paulo'
city.encode('utf_8')
city.encode('utf_16')
city.encode('iso8859_1')
city.encode('cp437')

UnicodeDecodeError 처리하기

모든 바이트가 정당한 아스키 문자가 될 수 없고, 모든 바이트 시퀀스가 정당한 UTF-8이나 UTF-16 문자가 되는 것이 아니므로 이진 시퀀스를 텍스트로 변환할 때 정당한 문자로 변환할 수 없을 때 발생한다.

#str에서 bytes로 디코딩하기: 성공 및 에러 처리

octets = b'Montr\xe9al'
octets.decode('cp1252')
octets.decode('iso8859_7')
octets.decode('koi8_r')
octets.decode('utf_8')
octets.decode('utf_8', errors='replace')

텍스트 파일의 인코딩을 모를 때, 인코딩 방식을 알아내는 법

바이트 시퀀스의 인코딩 방식을 알아내는 방법

HTTP나 XML같은 통신 프로토콜이나 파일 포맷은 내용이 어떻게 인코딩 되어 있는지 명시하는 헤더를 갖고 있는데, 바이트 스트림에는 127이 넘는 값이 있다면, 아스키로 인코딩되어 있지 않다는 것을 확신할 수 있고, UTF-8과 UTF-16 인코딩에서도 생성할 수 있는 바이트 시퀀스가 한정되어 있다.

다양한 문자 인코딩을 탐지하는 Chardet 패키지는 이런 방법을 이용해서 30가지 인코딩 방식을 알아내고, Chardet는 프로그램에서 사용할 수 있는 파이썬 라이브러일 뿐만 아니라 chardetect라는 명령행 유틸리티도 포함하고 있다.

$chardetect 04-text-byte.asciidoc
04-text-byte.asciidoc: utf-8 with confidence 0.99

인코딩된 텍스트의 이진 시퀀스는 인코딩에 대한 정보를 명시적으로 전달하지 않지만, UTF 포맷은 텍스트 앞에서 순서 표시(bytes order mark[BOM])를 추가할 수 있다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글