-
utf-8 파일 처리 중 bom으로 인한 출력 오류프로그래밍/의문 2016. 10. 11. 19:55반응형
파일을 읽었다.
with open(filename, mode="r", encoding="utf-8") as file:
return file.readlines()
그런데 readlines()로 가져온 결과물들을 print 하는 부분에서 뜬금 없이 예외가 발생했었다.
예외의 메세지는 /ufeff를 해석할 수 없음! 이유는 윈도우에서 utf-8로 텍스트 파일을 작성하면 파일의 가장 첫 부분에 bom(byte order mask)를 자동으로 붙이는데, 이 bom을 출력하려고 하니 문제가 발생한 것이다.
해결
utf-8로 파일을 읽으나, 파일의 첫 부분에 bom이 있을 경우 이를 제거한다.
with open(filename, mode="r", encoding="utf-8") as file: # (또는 open 시 encoding에 "utf-8 sig"를 지정한다!)
lines = file.readlines()
if len(lines) != 0:
lines[0] = lines[0].replace(u"\ufeff", '')
이제 bom이 있더라도 정상적인 문제 없이 출력할 수 있게 되었다.
utf-8에는 엔디안 문제가 일어나지 않으므로 bom이 필요 없지만, 대부분의 윈도우 텍스트 편집기들은 가장 앞 부분에 bom을 추가한다. 아마 해당 자료가 utf-8 인코딩이라는 표식으로 사용하는 경우일 것이다. 다만, 유닉스 계열의 텍스트 편집기는 bom을 사용하지 않는 경우가 많아, 이 부분의 호환에서 문제가 발생할 여지가 있다.
반응형'프로그래밍 > 의문' 카테고리의 다른 글
c#으로 ADOX.Create 시 클래스가 등록되지 않았습니다 예외 해결 (2) 2017.02.01 GPG 패킷 파싱 방법에 대한 흥미로운 스레드 (0) 2016.11.06 [c++] 람다 캡쳐 시 캡쳐된 값은 어디에 생성되는가 (0) 2016.08.17 비쥬얼 스튜디오에 tcmalloc 간단 적용 (0) 2016.07.22 c# + sqlite 사용 중 datetime 저장/조회에 발생한 문제 (0) 2016.07.17