눈큰아이입니다.

의외로 신입 개발자들을 만나다보면 문자셋이나 파일처리를 힘들어하는것 같더군요.
특히 텍스트 파일중 유니코드 파일이냐, 아스키파일이냐, UTF-8이냐를 구분하는 방법과, 리틀엔디안이냐, 빅엔디안이냐에 따라 달라지는 것들을 잘 이해하지 못하더군요.

우선 이 글에서는 BOM에 대해서만 소개해 봅니다.

BOM이란 Byte Order Marker의 약자입니다.
텍스트 파일을 처음 만들었을때에는 인코딩이라는게 개념이 약했지요.
그래서 ASCII Text파일에는 BOM이 없습니다.
점차 다국어를 지원하기 위해서 유니코드가 등장하고, 유니코드 중에서 UTF-8, UTF-16, UTF-32등 다양한 인코딩방식이 제안되었습니다.
그러다보니 이 파일이 어떤 인코딩을 사용했다하는 정보를 적을 필요가 있겠지요. 그래서 만들어진 것이 바로 BOM입니다.
텍스트 파일의 맨 앞부분에 지정된 패턴을 넣어둠으로써 이를 이용해서 인코딩방식을 감지하는 것이지요.

현재 지정된 표준은 다음과 같습니다.

텍스트 인코딩 BOM
UTF-8 EF BB BF
UTF-16BE FE FF
UTF-16LE FF FE
UTF-32BE 00 00 FE FF
UTF-32LE FF FE 00 00
ASCII no BOM


따라서 텍스트파일을 읽는 프로그램을 작성하는 경우라면 적어도 4바이트 정도 읽어서 특정 패턴이 있는지 없는지를 확인한 다음 처리하면 되겠습니다.

그럼 질문!
아무 내용도 없는 UTF-16 Big Endian형식의 파일 크기는 얼마일까요?
그렇죠. 2바이트입니다.

아무 내용이 없어도(empty string, "") BOM은 들어갑니다.

백문이 불여일견. 확인해 보세요.
메모장을 여시고, 저장할때 '새이름으로 저장'을 선택해서.
인코딩형식을 바꿔보세요. 그리고 탐색기에서 파일 속성창을 열어보세요.

BOM...이제 감이 오시나요?

도움이 되었으면 좋겠군요.

+ Recent posts