통합 개발 지식/개발에 필요한 잡다한 지식

UTF-8과 UTF-8-sig 의 차이점

개발자킹콩 2023. 2. 15. 13:27

UTF-8과 UTF-8-sig 의 차이점

파일을 읽을때 한국어의 경우 utf-8로 인코딩을 하게 된다. 그런데 파이썬으로 CSV 파일을 작업하고 엑셀로 데이터를 확인하는데 정상적으로 데이터가 들어가지 않고 칸이 밀린다거나 하는 문제가 발생했다. 이를 수정하기 위해 encoding 방식을 UTF-8-sig로 수정해서 해결했는데 UTF-8과 UTF-8-sig의 차이점이 궁금해져서 자료를 찾아보고 정리하게 되었다.

 

결론부터 말하면 

UTF-8은 BOM을 포함한다. 

UTF-8-sig는 BOM을 포함하지 않는다.

그렇다면 BOM을 뭘까?

 


 

BOM이란

BOM이란 문서 맨 앞에 눈에 보이지 않는 특정 바이트(byte)를 넣은 다음 이것을 해석해서 정확히 어떤 인코딩 방식이 사용되었는지 알아내는 방법을 나타냅니다. 자세하게 유니코드가 little-endian 인지 big-endian 인지 아니면 UTF-8 인지 쉽게 알 수 있도록, 유니코드 파일이 시작되는 첫부분에 보이지 않게, 2~3바이트의 문자열을 추가하는데 이것을 BOM이라고 합니다. BOM은 텍스트 에디터 화면에서는 보이지 않고, 헥사 에디터(Hex Editor)*로 열었을 때만 보입니다.

 


 

BOM의 종류

인코딩 방식Byte Order Mark(BOM)
UTF-8 EF BB BF
UTF-16 Big Endian FE FF
UTF-16 Little Endian FF FE
UTF-32 Big Endian 00 00 FE FF
UTF-32 Little Endian FF FE 00 00

UTF-16 이상 인코딩일 때, 문서의 맨 처음 BOM을 파악하여 Big Endian인지 Little Endian인지 구분하지만 UTF-8의 경우는 BOM이 하나로 고정입니다. 그래서 이 BOM은 바이트 순서와(Byte Order) 상관없기 때문에 UTF-8 Signature라고 불리기도 합니다. 즉, 해당 문서가 UTF-8로 인코딩되었다는 사실을 알리는 사인(signature)입니다.

 


 

BOM 문제점

UTF-8에는 BOM이 없는 것이 보통인데(UTF-8은 BOM이 고정이라 인코딩 방식을 자동으로 알 수 있음), 일부 윈도우즈 프로그램(메모장과 엑셀)은 UTF-8 파일을 생성할 때 자동으로 BOM을 집어넣습니다. 윈도우즈 환경에서는 눈에 띄지 않는 경우가 많지만 리눅스(LINUX)나 유닉스(UNIX) 환경에서는 많은 문제를 일으키는 원인이 됩니다. BOM이 추가된 데이터의 경우, 글자 앞에 빈칸이 생기면 그 차이점을 알 수 있지만 대개 눈으론 보이지 않습니다.

데이터베이스에서 BOM이 추가된 데이터와 그렇지 않은 데이터를 비교할 경우 눈으로는 동일한 데이터지만 비교를 할 땐 같지 않다는 데이터로 나옵니다. 그 이유는 문자열 앞에 BOM이 붙어있기 때문입니다. (이 문제때문에 하루를 고생한적이..)

 

울트라에디트라는 프로그램을 울트라에디트의 헥사 모드(Ctrl+H)로 UTF-8 파일을 보면, 16비트 유니코드처럼 보이고 BOM이 있든 없든 항상 FF FE 라는 엉뚱한 BOM이 나타납니다. 이것은 울트라에디터가 유니코드를 편집할 때, 내부적으로 '16비트 little-endian 유니코드 (UTF-16LE)'로 변환하여 편집하기 때문입니다. 진짜 헥사 에디터로 보아야만 UTF-8의 BOM인 EF BB BF 가 제대로 보이게 됩니다. 물론 BOM이 없는 UTF-8이라면 BOM이 없는 것으로 나옵니다

 

 

 


 

해결책

가장 좋은 방법으로는 메모장 같은 프로그램보단 BOM설정이 가능한 프로그램을 사용하는 것입니다. 하지만 모든 파일을 BOM설정이 가능한 프로그램을 사용할 수 없기 때문에 BOM파일을 받은 다음, 코드로 해당 파일을 UTF-8로 인코딩 처리하는 부분도 생각해야 합니다.

그리고 파이썬에서 데이터를 저장하기 위해 CSV파일을 생성하고 엑셀과 같은 파일로 데이터를 확인할 때 한칸씩 밀린다면 encoding을 utf-8에서 utf-8-sig로 수정한다면 이를 해결할 수 있다.

 

 


 

참고 문헌

 

https://brownbears.tistory.com/124

 

유니코드 BOM(Byte Order Mark)

BOM이란BOM이란 문서 맨 앞에 눈에 보이지 않는 특정 바이트(byte)를 넣은 다음 이것을 해석해서 정확히 어떤 인코딩 방식이 사용되었는지 알아내는 방법을 나타냅니다. 자세하게 유니코드가 little-

brownbears.tistory.com

 

https://ko.wikipedia.org/wiki/바이트_순서_표식#cite_note-unicode_FAQ-1

 

바이트 순서 표식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 바이트 순서 표시(Byte Order Mark, BOM)는 유니코드 문자 U+FEFF byte order mark로, 매직 넘버로서 문서의 가장 앞에 추가하여 텍스트를 읽는 프로그램에 여러 정보를 전

ko.wikipedia.org