UnicodeError라는 범용 에러가 있고, 거의 항상 UnicodeEncodeError(str을 이진 시퀀스로 반환) 혹은 UnicodeDecodeError(이진 시퀀스를 str로 읽어 들일 때)같은 구체적인 에러가 발생하고, 파이썬 모듈을 로딩할 때 소스 코드가 예기치 않은 방식으로 인코딩되어 있을 경우 SyntaxError가 발생하기도 한다.
대부분 비UTF 코덱은 유니코드 문자의 ㄹ부만 처리할 수 있고 텍스트를 바이트로 변환할 때 문자가 대상 인코딩에 정의되지 않을 경우, 인코딩 메서드나 함수의 errors 인수에 별도의 처리기를 지정하지 않는 한 UnicodeEncodeError가 발생한다.
#바이트로 인코딩하기: 성공 및 에러 처리
city = 'Sao Paulo'
city.encode('utf_8')
city.encode('utf_16')
city.encode('iso8859_1')
city.encode('cp437')
모든 바이트가 정당한 아스키 문자가 될 수 없고, 모든 바이트 시퀀스가 정당한 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])를 추가할 수 있다.