KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
The universe is laughing behind your back.
FrontPage › BOM
BOM, Byte Order Mark

바이트가 기본 단위인 UTF-8과 달리 UCS-2와 UTF-16은 2 바이트가 기본 단위이고, UTF-32에서는 4 바이트가 기본 단위이므로 바이트 열로 바꿀 경우 최상위 바이트가 먼저 오느냐 (Big Endian) 나중에 오느냐 (Little Endian)에 따라 두 가지 다른 표현이 가능하다. 이 순서를 표시하기 위해 문서의 선두에 그 위치에서는 아무런 구실을 할 수 없는 U+FEFF (Zero Width Non-Breaking Space)를 두어서 바이트 순서를 자동으로 알아내도록 할 수 있다. 예컨대, UTF-16의 Little Edian에서는 BOM을 FF FE로 반면 Big Edian에서는 FE FF로 직렬화한다. UTF-32LE라면 FF FE 00 00이고, UTF-32BE라면 00 00 FE FF일 것이다. BOM(U+FEFF)은 UTF-8로 나타내면 EF BB BF이다.
UTF-16 LE FF FE
UTF-16 BE FE FF
UTF-32 LE FF FE 00 00
UTF-32 BE 00 00 FE FF
UTF-8 EF BB BF

UTF-8 편집기를 이용한 LaTeX/Lambda 작업에서 BOM 문제

Win32의 일부 프로그램 (Notepad, Wordpad, MS Word) 등은 UTF-8 BOM을 Win 9x/ME에서 쓰이는 [http]ANSI[1] code page (한국어 Windows라면 codepage 949 - 확장 완성형)로 작성된 텍스트 파일과 구별하기 위한 표지로 사용한다. 즉, UTF-16, UTF-32, UTF-8 BOM이 있으면 UTF-16, UTF-32, UTF-8로 인식하고 그렇지 않은 경우 ANSI code page를 쓴 것으로 간주한다. XML 표준에서도 UTF-8 BOM을 비롯한 BOM을 인코딩 결정을 위한 하나의 방법으로 명시하고 있다. 하지만, UTF-8 BOM은 POSIX 기반 OS에서 cat file1 file2 file3 | another_program과 같은 파이프를 쓸 때에 문제를 일으키므로 그다지 환영받지 못 한다. TeX/Omega 입장에서도 Notepad, Wordpad 등이 BOM을 UTF-8에 붙이는 것은 그다지 반가운 일이 아니다. TeX/Omega compiler는 .tex 파일 선두에 의미를 알 수 없는 글자가 있는 것으로 여기므로 경고를 낸다. 그냥 <Enter>를 치고 강제 컴파일하면 빈 페이지가 처음에 붙어 나온다. -- 신정식

----
  • [1] ANSI와 아무 관련이 없지만, MS는 이 용어를 쓴다.

TeX Implementation과 BOM

  • 2008년 현재, Windows TeXLive(KC2008)의 실행파일들(latex, pdflatex etc)은 BOM이 붙어있든 그렇지 않든 잘 처리한다.
  • MiKTeX은 BOM을 처리하지 못한다.

KTUGCollection2006과 BOM

BOM 처리 문제는 KTUGCollection2006에서 처음 도입되었다. Akira Kakuto 씨의 W32TeXW32TeX/ko로 정비하는 과정에서 Akira 씨에게 부탁하여 TeX, e-TeX, PDFTeX, Omega, Aleph의 실행파일이 BOM 붙은 UTF-8 TeX 입력파일을 처리할 때 BOM을 무시(제거)하도록 하는 루틴을 적용하게 되었다. 그 후, 이 BOM 처리 루틴은 TeXLive 2007, 2008과 KC2007, KC2008에 이어졌다.

BOM 제거를 권장

그러므로 파일 교환 등의 목적을 위해서라면 원본 파일에서 BOM을 제거하는 것이 바람직하다.

에디터와 BOM

아래아한글(한글2005 등), 메모장(NotePad), 워드패드, UltraEdit에서는 UTF-8로 저장하면 자동으로 BOM을 붙여준다. 반면 Windows용 Yudit에서는 Linux에서와 마찬가지로 BOM을 붙이지 않는다. 윈도 운영체제에서 UTF-8 엔코딩으로 LaTeX 문서를 만드는 사람들은 BOM 문제를 스스로 처리하여야 할 것이다.
UTF-8에서 BOM이 반드시 필요한가는 의문이다. 없어도 좋을 듯. NotePadUltraEdit으로 유니코드 .tex 소스를 편집한 경우라면 유니코드(UTF-16)로 저장한 다음 libiconv를 이용해서 UTF-8로 변환하면 귀찮은 UTF-8 BOM을 제거해준다.
위에서 적은 바와 같이 별 필요가 없고, 짜증납니다. 반면에 인코딩을 자동으로 알아내는데에 유용하기는 합니다. Perl로는 다음과 같이 해서 제거할 수 있습니다. (Perl Unicode list에 올라온 것입니다.)
#!/usr/bin/perl -pi~ -0777
   # program to remove a leading [UTF-8] BOM from a file
   # works both STDIN -> STDOUT and on the spot (with filename as argument)
   if ($] > 5.007) {
   require Encode;
   Encode::_utf8_off($_);
   }
   s/^\xEF\xBB\xBF//s;
다른 방법도 있습니다 (Perl이므로 얼마든지 다른 식으로 할 수 있지요.) -- 신정식

UltraEdit의 경우


다음 옵션을 %SystemRoot%\UEdit32.INI에 넣어주면, BOM 없이 저장할 수 있다
Write UTF-8 BOM = 0
Write UTF-8 BOM NF = 0
첫 줄은 기존 파일을 UTF-8로 저장했을 때, BOM을 붙일 것인가를 지정하며, 두번째 줄은 새 파일을 UTF-8을 사용하여 만들었을 때, BOM을 붙일 것인지 지정한다. (0이 붙이지 않음, 1이 붙임)

UltraEdit의 경우, Advanced -> General 에서 BOM 제거 선택여부를 지정할 수 있습니다.

EditPlus

EditPlus의 경우는 기본설정이 'BOM 제거'입니다. -- 황재훈



2008.12.20 이것때문에 보름을 끙끙댔습니다.ㅜㅜ EDIT+ 3 을 사용하는데, 기본설정>파일에서 UTF-8 식별기호 메뉴에서 선택가능하더군요. 항상 식별기호 제거로 하셔야.. -- Kailey

AcroEdit

AcroEdit는 0.9.4.21버젼부터 도구>환경설정>저장>유니코드저장시BOM저장 에서 BOM 저장여부를 선택할 수 있습니다. -- 샘처럼

그 외 Microsoft Visual Studio.NET에서 사용하는 IDE의 경우, 고급 저장 옵션으로 BOM을 붙일 것인지 지정할 수 있다. -- kheled

NotePad++

Notepad++에서는 설정>환경설정>새문서>인코딩을 "UTF-8 without BOM"으로 선택하면 이후 만든 문서에서 BOM을 제거해줍니다. 기본 설정은 Ansi로 되어 있습니다. --파초

^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-01-31 11:37:09
Processing time 0.0441 sec