ホーム > ブログ > Bear's Droppings > UTF-8 と BOM の関係 このエントリーを含む はてなブックマーク 0 users

UTF-8 と BOM の関係

Posted by bear.mini at 2009/01/04 13:01:21 (Last updated: 2009/01/05 14:53:38)
タグ: Computer

Unicode 入門の記事 に対するコメントで おこめ さんから「BOM 付きの場合単に UTF-8 と呼び、BOM なしの場合 UTF-8N と呼ぶ」のは間違いだというツッコミがありましたので、自分自身の理解を整理するためにも再度調査してみました。

 

まず、ja.wikipedia.org によりますと、

BOMありの方をUTF-8、なしの方をUTF-8Nと呼ぶこともあるが、このような呼び分けは日本以外ではほとんど知られておらず、また公的規格などによる裏付けもない。

http://ja.wikipedia.org/wiki/UTF-8

とされています。

 

また、unicode.org の FAQ のページによると、

Q: Can a UTF-8 data stream contain the BOM character (in UTF-8 form)? If yes, then can I still assume the remaining UTF-8 bytes are in big-endian order?

 

A: Yes, UTF-8 can contain a BOM. However, it makes no difference as to the endianness of the byte stream. UTF-8 always has the same byte order. An initial BOM is only used as a signature — an indication that an otherwise unmarked text file is in UTF-8. Note that some recipients of UTF-8 encoded data do not expect a BOM. Where UTF-8 is used transparently in 8-bit environments, the use of a BOM will interfere with any protocol or file format that expects specific ASCII characters at the beginning, such as the use of "#!" of at the beginning of Unix shell scripts. [AF] & [MD]

 

http://unicode.org/faq/utf_bom.html#bom5

とのことで、拙訳・要約すると

  • UTF-8 でエンコーディングしたデータストリームに BOM を含めることは可能。(もちろん、含めなくてもよい)
  • ただし、BOM をつけると、ASCII 文字だけを期待しているプロトコルとかファイルフォーマットには使えなくなる。(たとえば、Unix のシェルスクリプトの先頭の #! (sheban) とかが BOM の後になってしまうので BOM をつけてはいけない)

とのことですので、本来の意味としては、BOM の有り無しにかかわらず UTF-8 と呼ぶのが正しいようです。

 

つまり、元記事に対するおこめさんの指摘どおり、「BOM 付きの場合単に UTF-8 と呼び、BOM なしの場合 UTF-8N と呼ぶ」のは正しくないようです。

 

実用上の意味を考えると、特にテキストエディタでファイルを保存したりするときに、BOM をつけるかつけないかを制御できたほうがうれしいと思いますが、それは UTF-8N という呼称を使うかどうかはまた別次元の問題ですしね。

 

 

ここで俄然興味がわいてきたのが、UTF-8N という呼称を誰が使い始めたのだろう?ということです。

 

http://suika.fam.cx/~wakaba/wiki/sw/n/BOM

 

によると、「Unicode Consortium のそれなりに偉い人(誰かは忘れた)」だそうですが・・・

 

 

以下、話題はそれて。

 

そもそも UTF-8 に BOM をつけること自体に対して賛否両論があるように感じますが、それぞれの主張は主に以下の点にあるようです:

 

賛成:

  • フォーマットの識別が容易になる
    (先頭の3バイトを読むだけで、UTF-8 でエンコーディングされているとみなすことができる)
  • ASCII 文字しか含まれないデータであっても、UTF-8 であることを明示できる
    (後の修正でデータに ASCII 範囲外の文字が含められてしまっても、エンコーディングを気にする必要がない)

 

反対:

  • ASCII 文字しか使用しない場合に ASCII と完全に一致するというメリットを捨てることになる

 

私個人としては、BOM をつけられる場面ではなるべくつけておくべき(特にテキストファイルの場合)と思います。

というのも、仕事上で以下のようなことがあったからです:

  1. ソフトウェア開発プロジェクトで、バージョン管理システムや統合開発環境、その他ツールとの相性を考えて、ソースコードはすべて UTF-8 で保存するようにルールを決定した。
  2. ある小さなソースコードには日本語がまったく含まれず、BOM なしの UTF-8 で保存したところ、次回そのファイルを開いたときにテキストエディタによってエンコーディングは ASCII と判断された。
  3. そのことに気づかないままそのソースコードを編集し、ASCII 以外の文字(日本語など)が含まれた状態で上書き保存した。このとき、テキストエディタは日本語 Windows のデフォルトエンコーディングである Shift-JIS (CP932) で保存した。
  4. そのファイルを Subversion リポジトリにコミット、日本語版以外の Windows や、Linux を使用している開発者の環境でそのファイルをチェックアウトして開いたところ、文字化けが発生。

 

もし、BOM なしではなくて BOM ありの UTF-8 でファイルを保存していたとしたら、2. の段階で UTF-8 として開きなおされるはずなので、このような問題が起こらなかったはずです。

これが、上のリストで「後の修正でデータに ASCII 範囲外の文字が含められてしまっても、エンコーディングを気にする必要がない」と書いた理由です。

 

 

上記は UTF-8 でエンコーディングする側の論理ですが、UTF-8 を読み取る側のプログラムを書いたりしている人は、BOM をつけてもつけなくても UTF-8 であると決まっている以上、つべこべ言わずにどちらの場合にも対応しなければならないでしょう。

 

結局のところ送り手は謙虚に、受け手は寛容に、という Postel 則がここにもあてはまりそうです。

 

 

[追記 2008.01.05]

はてブで

「#!が動かなくなる害」>>>>>>>>>「文字化け」と思う。見りゃ分かる害と、見てすぐ分からない害では後者の方が深刻

というツッコミをいただきました。

確かにそのような考え方もありますね。(というか、僕自身それでハマったことがある気がします)

 

vim では EF BB BF が入っていると <feff> って表示してくれたり、他のエディタでもいろいろサポートしてくれるので、開いてみれば気づくといえば気づくのですが・・・これは反論としては弱いですね。(むしろ、vim がそうやってあからさまに表示してくれるというのは、この問題にハマる人の多さを物語っているような気もします)

 

/bin/sh なりのインタプリタ(?)が、U+FEFF 付きの UTF-8 にも寛大に対応してくれればみんながハッピーになれる気がするのですが、そうなっていないのはやっぱり UTF-8 に U+FEFF が付いているのは邪道だということでしょうかね。

それとも、何か他の理由があるのかな・・・?

このページに寄せられたコメント

beakmark
2009/01/04
15:08:48 --06:00
UTF-8 に U+FEFF(ZWNBSP) を付ける時に、それは意味的にはもはや BOM とは呼ばないんじゃまいか、というツッコミを念のため。

じゃ、8日にTYでーー。
bear.mini
2009/01/04
16:10:33 --06:00
たしかに、すでに BOM (= Byte Order Mark) ではなくなってますね。
ちゃんと U+FEFF(ZWNBSP) と呼ぶべきですかね。(そう呼ぶのが面倒なのでつい BOM と呼んでしまっている感じですが・・・)
なんて呼べばいいでしょうね。Encoding Identification Mark で EIM とか?(笑)

U+FEFF(ZWNBSP) 自体は Zero-Width No-Break Space とう名前が示すように、「幅がなくて break もしない」(実質的にそこに何も存在しない様に見える)という、少し抽象的というかメタな文字として定義されているので、UTF-16 における Byte Order 識別の用途は単に hack というか(歴史的経緯はもしかしたら逆かもしれませんが)、UTF-8 ではエンコーディングの識別用のマークとして使用してもよさそうですね。
poimandres
2010/06/09
20:58:46 --05:00
> /bin/sh なりのインタプリタ(?)が、U+FEFF 付きの UTF-8 にも寛大に対応してくれれば
これは、"#!"の話と思っていいですよね。
"#!"はshとかが見る以前に、そのスクリプトを誰に実行させるか判断する時点で解析されます。
私が大昔に見たUNIXでは、カーネルの中で見てました。
今のUNIXやLinuxとかでどうなってるかは知りません。
bear.mini
2010/06/11
02:46:52 --05:00
poimandres さん

はい、#! (shebang) の話です。
たしかに、#! はインタプリタが見てるんじゃなくて、Linux でいえば execve(2) システムコールの中で見てるようですね。
となると、Kernel レイヤで U+FEFF つきの Shebang に対応してもらわないといけないということになりますか、、、やっぱり難しそうですね。
bear.mini
2010/06/11
02:56:12 --05:00
あと、beakmark さんのはるか昔のツッコミに対して少々自己弁護をば。

僕は普段 Windows 環境でちょっとしたテキストを読み書きするとき、メモ帳代わりに Notepad++ というエディタを使うことがあるのですが、これの Encoding メニューに
"Encode in UTF-8" と "Encode in UTF-8 without BOM" という選択肢があるのをよく目にしていたので、UTF-8 においても U+FEFF のことを BOM と呼ぶのは普通のことだと思っていました。
(例が一つしか無いので根拠に乏しいのですが、、、)

今は正確さを要するときはちゃんと U+FEFF って言ったりするように気をつけるようになりましたが、やっぱり言いやすいので BOM(ボム)と言っちゃうことがあります。(^^;

コメントしてください:
お名前: (半角/全角問わず 16 文字まで)
コメント:
(no HTML)
確認:
このテキストボックスに "確認" の 2 文字を書くと投稿できるようになります。
投稿ボタンが自動的に有効にならない場合は、ここをクリックしてください
これは、自動的にスパムコメントを書き込もうとする悪意をもったプログラムと、 そうでないあなたを識別するためのものです。お手数をおかけしますがよろしくお願いします。 また、ブラウザによっては対応していない場合があるかも知れません。IE 7 と Firefox で動作確認を行いました。

このページに寄せられたトラックバック

このページはまだトラックバックを受信していません。

このページへのトラックバック Ping URL:
http://bearmini.net/trackback.aspx?~/blog/view.aspx?bid=1&aid=144

このサイトの上位人気記事