BOM (Byte Order Mark) 정의와 문제

BOM ??
Byte Order Mark 의 약자이며 한글로 표현하면 바이트 순서 표식!!
일반적으로는 그냥 BOM이라고 표현한다.
의미를 보면 유니코드에서 엔디안을 구별하기 위해 사용되는 문자이며 유니코드에서 바이트를 배열하는 방법을 구별하기 위해 사용되는 문자라고 할 수 있네요.


엔디안??
엔디안(Endianness)은 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 의미하며
바이트를 배열하는 방법은 바이트 순서라고 한다고 합니다.
엔디안은 빅엔디언, 리틀엔디언, 미들엔디언으로 구별되며 일반적인 PC에서는 작은 단위의 바이트가 앞에 오는 리틀 엔디언 방법을 사용하고
네트워크에서는 큰 단위의 바이트가 앞에 오는 빅 엔디언을 사용한다고 합니다.


BOM을 쓰는 이유?!

바이트 순서 표식(Byte Order Mark, BOM)은 유니코드에서 엔디안을 구별하기 위해 사용되는 문자로, 문자 값은 U+FEFF이다.

UTF-16UTF-32와 같은 인코딩에서는 엔디안의 종류에 따라 문자열의 값이 완전히 달라지므로, 문자열의 엔디안을 구별할 수 있는 표식이 필요하다. 이에 따라 유니코드 문자열 앞에 BOM 문자를 붙여, 맨 처음에 읽히는 값에 따라 엔디안을 구별한다.

예를 들어, UTF-16에서 빅 엔디안의 경우에 문자열의 가장 처음 두 바이트는 FE FF가 된다. 리틀 엔디안의 경우에는 FF FE가 된다.

UTF-8에는 엔디안 문제가 일어나지 않으므로 BOM을 붙여야 할 필요는 없지만, 해당 자료가 UTF-8 인코딩이라는 표식으로 사용하는 경우도 있다. 특히 마이크로소프트 윈도의 많은 문서 편집기는 UTF-8로 저장할 경우 자동으로 문서의 가장 앞부분에 BOM을 추가한다. 이와는 반대로 유닉스 계열의 문서 편집기는 BOM을 사용하지 않는 경우가 보통으로, 이 경우 문서의 BOM을 잘못 인식하여 문제가 발생할 수도 있다. 예를 들어, PHP 인터프리터에서는 BOM을 인식하지 못하고 일반 문자열로 간주하는데, PHP에서 HTTP 헤더를 변경하려면 그 시점에서 어떠한 문자열도 출력해서는 안 된다(php.net 도움말). 하지만 문서에 BOM이 있으면 문자열 출력이 일어나고, 따라서 헤더를 변경할 수 없다는 경고가 발생하게 된다.


각 유니코드 인코딩 방법에 따른 BOM 값은 다음과 같다.


EncodingRepresentation
UTF-8EF BB BF
UTF-16 빅 엔디안FE FF
UTF-16 리틀 엔디안FF FE
UTF-32 빅 엔디안00 00 FE FF
UTF-32 리틀 엔디안FF FE 00 00
SCSU0E FE FF
UTF-EBCDICDD 73 66 73
BOCU-1FB EE 28





BOM을 쓰다 생길 수 있는 문제!!?!


오늘 작업중에 특정파일에 텍스트를 가져오는 과정에서 "?" 문자를 더해서 가져오는 문제가 발생하였다.

캐삽질 끝에 확인해본 결과 UTF-8형식으로 된 파일에 BOM이 문제였던 것!!!


ex)abc.txt 파일에 내용이 "자기개발을 멈추면 죽는다.......................왜?!..........." 라는 텍스트였다면 file 을 읽어들이면 

"?자기개발을 멈추면 죽는다.......................왜?!..........." 라고 읽힌다. 하앜.......



UTF-8은 MS 텍스트 편집기로 사용했을때 자동으로 BOM을 앞에 2~3바이트 정도 자동으로 붙여준다고한다...

삽질 2번 안하기 위해서 블로그 정리함..ㅎㅎ.


이 글을 공유하기

댓글

Designed by JB FACTORY