다른 방법으로, open 함수의 encoding 파라미터를 명시하면 플랫폼에 따라 동작이 달라져서 놀라는 일을 막을 수 있다. 예를 들어 다음 코드에는 파일에 들어 있는 이진 데이터가 실제로 cp1252(윈도우에서 사용하던 레거시 인코딩 방식)로 돼 있다고 가정한다.
with open('data.bin', 'r', encoding='cp1252') as f: data = f.read() assert data == 'ñòóôõ'
예외가 사라졌고, 파일의 내용을 문자열로 해석한 내용은 기존 이진 데이터를 읽었을 때 반환됐던 것과 전혀 다르다. 여기서 다음 사실을 알게 된다. 여러분이 예상하는 것과 시스템의 디폴트 인코딩이 어떻게 다른지 이해하기 위해 시스템 인코딩을 항상 검사해야(python3 -c 'import locale; print(locale.getpreferredencoding())') 한다는 것이다. 디폴트 인코딩이 의심스러운 경우에는 명시적으로 open에 encoding 파라미터를 전달해야 한다.
기억해야 할 내용
• bytes에는 8비트 값의 시퀀스가 들어 있고, str에는 유니코드 코드 포인트의 시퀀스가 들어 있다.
• 처리할 입력이 원하는 문자 시퀀스(8비트 값, UTF-8로 인코딩된 문자열, 유니코드 코드 포인트들)인지 확실히 하려면 도우미 함수를 사용하라.
• bytes와 str 인스턴스를 (>, ==, +, %와 같은) 연산자에 섞어서 사용할 수 없다.
• 이진 데이터를 파일에서 읽거나 파일에 쓰고 싶으면 항상 이진 모드('rb'나 'wb')로 파일을 열어라.
• 유니코드 데이터를 파일에서 읽거나 파일에 쓰고 싶을 때는 시스템 디폴트 인코딩에 주의하라. 인코딩 차이로 놀라고 싶지 않으면 open에 encoding 파라미터를 명시적으로 전달하라.