utf-8 BOM

atie의 이미지

간단한 팁 겸 정보 하나,

반나절을, 왜 잘 돌아가던 MQ broker가 특정 xml을 처리를 못할까하는 문제로 씨름을 했었습니다. 원인은 utf-8 BOM (byte-order mark) 였습니다.
xml 에디터로 그 파일을 열어보고는 원인을 찾지 못하다가, thunderbird에서 첨부된 그 xml을 보고서야 깨닫게 되었죠. thunderbird가 희한하게 3byte의 BOM을 특수문자로 보여주더군요. (그런후, 헥사에디터로 보니 확연해지더군요.)

그래서, 테스트 해 보았습니다.

thunderbird (특수 문자로 잘 보여 줍니다.)
firefox (보여주지 않습니다. ie 따라가느라고 xml 들여쓰기만 신경을 쓴 듯)
kongueror(아예 xml 태그도 보여주지 않습니다.)
emacs(박스 형태로 특수 문자가 있다는 것을 보여줍니다.)
vim(헥사값으로 보여주던데 신기하더군요.)
gedit,kwrite,notepad 모두 보여주지 안씁니다.
xmlspy(안 보여주는데 저장을 하면 BOM을 떼어버리고 저장을 하더군요.)

Quote:
Byte order mark (BOM)

The UCS character U+FEFF "ZERO WIDTH NO-BREAK SPACE" is also known
informally as "BYTE ORDER MARK" (abbreviated "BOM"). This character
can be used as a genuine "ZERO WIDTH NO-BREAK SPACE" within text, but
the BOM name hints at a second possible usage of the character: to
prepend a U+FEFF character to a stream of UCS characters as a
"signature". A receiver of such a serialized stream may then use the
initial character as a hint that the stream consists of UCS
characters and also to recognize which UCS encoding is involved and,
with encodings having a multi-octet encoding unit, as a way to
recognize the serialization order of the octets. UTF-8 having a
single-octet encoding unit, this last function is useless and the BOM
will always appear as the octet sequence EF BB BF.

http://www.faqs.org/rfcs/rfc3629.html에서 인용.

Forums: 
Necromancer의 이미지

bom은 utf16/32에만 보여지지 않나요? utf8에서는 안쓰는 걸로 아는데.

Written By the Black Knight of Destruction

progcom의 이미지

UTF-8에는 BOM을 지정할 필요가 없습니다. :) 유니코드 BOM 문자이지요.
UTF-8은 Byte-Order를 지정할 필요가 없으니까요. 멀티바이트 유니코드 인코딩을 위해서 필요한 부분입니다.

이것때문에 한참 논란이 되었던 적이 있었던거 같은데, 자세한 내용은 잘 기억이 안나는군요. :-( UTF-8에도 BOM을 붙이라는건 MS 측에서 주장을 강하게 했던걸로 기억합니다. 그래서인지, 윈도우의 notepad는 UTF-8으로 저장을 할때 BOM을 꼭 붙입니다. 기타 대다수의 프로그램은 특별히 지정하지 않는한 붙이지 않는걸로 압니다.

위에서 인용한 부분의 조금 아래에 써있지만, UTF-8의 유니코드 BOM을 표시(display)할 때, 무시(ignore)하는걸 권장(RECOMMENDED)하고 있습니다. firefox의 동작은 표준대로 잘 돌아가는 것이고, IE 따라하기와는 관계가 없습니다.

*NIX 계열 편집기(vim,emacs 등)에서는, #! 으로 시작해야만 하는 쉘 스크립트 등을 지원하기 위해서 따로 표시를 하는 경우가 많습니다. (UNICODE FAQ에도 같은 내용이 쓰여져 있습니다)

추가: xml 파서는 UTF-8 문서라도, BOM이 붙어있을 경우를 처리할 수 있어야 합니다. 위 처리 예제 중에서는 xmlspy 식의 처리가 가장 적절한게 아닐까 싶네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.