BOM (Byte Order Mark) 정의와 문제
- 프로그래밍/프로그래밍일반
- 2014. 1. 15. 18:35
바이트 순서 표식(Byte Order Mark, BOM)은 유니코드에서 엔디안을 구별하기 위해 사용되는 문자로, 문자 값은 U+FEFF이다.
UTF-16, UTF-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 값은 다음과 같다.
BOM을 쓰다 생길 수 있는 문제!!?!
오늘 작업중에 특정파일에 텍스트를 가져오는 과정에서 "?" 문자를 더해서 가져오는 문제가 발생하였다.
캐삽질 끝에 확인해본 결과 UTF-8형식으로 된 파일에 BOM이 문제였던 것!!!
ex)abc.txt 파일에 내용이 "자기개발을 멈추면 죽는다.......................왜?!..........." 라는 텍스트였다면 file 을 읽어들이면
"?자기개발을 멈추면 죽는다.......................왜?!..........." 라고 읽힌다. 하앜.......
UTF-8은 MS 텍스트 편집기로 사용했을때 자동으로 BOM을 앞에 2~3바이트 정도 자동으로 붙여준다고한다...
삽질 2번 안하기 위해서 블로그 정리함..ㅎㅎ.
이 글을 공유하기