[CS] 바이트 순서 표시 (BOM)

    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 떄문에 시간을 날렸으니 다음부터는 주의하도록 하자.

    참고

    반응형

    댓글

    Designed by JB FACTORY