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의 종류
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로 수정한다면 이를 해결할 수 있다.
참고 문헌
유니코드 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
'통합 개발 지식 > 개발에 필요한 잡다한 지식' 카테고리의 다른 글
VSync 수직동기화란? (0) | 2023.04.08 |
---|---|
프레임워크 vs 라이브러리 vs 모듈 vs 플러그인 (0) | 2023.03.11 |
[용어 정리] 프로그램? 프로세서? 프로세스? (0) | 2023.02.25 |
Repository: 용어정리 (0) | 2021.09.15 |
프로젝트 관리 - 소프트웨어 공학에서의 나의 생각 (0) | 2021.09.09 |