[CS] 바이트 순서 표시 (BOM)
- ⭐ Development/CS
- 2022. 6. 27.
1. 시작하며
업무 도중 UTF-8 BOM 이슈가 있어 문자열 인코딩 에 이어 BOM 에 대해 공부하고자 한다.
2. 바이트 순서 표시 (BOM) 이란
- 바이트 순서 표시(Byte Order Mark, BOM)는 유니코드 문자 U+FEFF로, 매직 넘버로서 문서의 가장 앞에 추가하여 텍스트를 읽는 프로그램에 여러 정보를 전달할 수 있다.
- UTF-16, UTF-32 의 경우 BOM을 사용한다.
- BOM을 반드시 사용할 필요는 없으며, 사용할 경우 문서의 가장 앞에 등장해야 한다.
- 일반 에디터에서는 보이지 않고 헥사 에디터를 사용해야 보인다.
3. BOM 사용법
- BOM은 문자열 가장 맨 앞 2바이트에 0xFEFF(유니코드로 U+FEFF)로 표기하여 사용한다.
- 0xFE와 0xFF 중 어떤 문자가 먼저 오는지에 따라 첫 두 바이트가 FE FF이면 빅 엔디언(Big Endian, BE), FF FE이면 리를 엔디언(Little Endian, LE) 로 나뉜다.
- 문서가 빅 엔디언으로 작성되어 있을 경우, BOM 문자는 바이트열에서 0xFE 0xFF로 기록된다.
- 문서가 리틀 엔디언으로 작성되어 있을 경우, BOM 문자는 바이트열에서 0xFF 0xFE로 기록된다.
- BOM을 이용하여 바이트 표현 순서를 정하는 이유는 CPU 설계에 따라 바이트 값을 처리하는 순서가 다르기 때문이다. 같은 0xFEFF를 CPU가 읽을 때 리틀 엔디언 방식은 0xFF 다음 0xFE를 읽고, 빅 엔디언 방식은 0xFE 다음 0xFF 를 읽는다.
- 오늘 날의 대부분의 컴퓨터는 리틀 엔디언 방식을 사용한다.
- 각 엔디언의 자세한 내용은 위키에서 확인하자.
빅 엔디언은 소프트웨어의 디버그를 편하게 해 주는 경향이 있다.
리틀 엔디언은 메모리에 저장된 값의 하위 바이트들만 사용할 때 별도의 계산이 필요 없다는 장점이 있다.
인코딩에 따른 바이트 순서 표식
인코딩 | 16진수 표현 |
UTF-8 | EF BB BF |
UTF-16 (BE) | FE FF |
UTF-16 (LE) | FE FF |
UTF-32 (BE) | 00 00 FE FF |
UTF-32 (LE) | FF FE 00 00 |
4. UTF-8에는 BOM이 없는 이유
UTF-8에는 BOM 이 없다. UTF-8도 BOM에 해당하는 값이 있지만(0xEF, 0xBB, 0xBF), 1 바이트 단위로 글자를 변화하기 때문에 글자를 읽는 순서가 달라도 영향을 받지 않는다.
따라서 UTF-8은 BOM을 사용할 필요도 없고 권장 하지도 않는다. 대부분의 라이브러리나 프로그램은 UTF-8 문자열이나 파일을 읽을 때 BOM을 발견해도 무시하고 넘어간다. 심지어 JSON 규격은 BOM을 허용하지 않는다.
5. BOM 확인 하기
에디터에서 BOM 확인하기
Hex Editor를 따로 써야 BOM을 확인 할 수 있다. UTF-8 BOM 인 파일이라면 EF BB BF 가 앞에 붙어 있다.
DB 에서 BOM 확인하기
눈으로 보기에는 BOM 이 추가된 데이터를 확인할 수 없기 때문에 아래 쿼리로 데이터를 확인해본다. 그러면 데이터 문자열 앞에 EFBBBF 가 붙어 있는 것이 보인다.
select HEX(컬럼) from 테이블명
6. 마치며
UTF-8 BOM 떄문에 시간을 날렸으니 다음부터는 주의하도록 하자.
참고
반응형