BOM

BOM

Byte Order Mark

バイト順印。

[1] ISO/IEC10646 には「byte order mark」という言葉は出てきません (UnicodeStandard には出てきます)。 10646 は BOM のことを、「UCS を識別する『signature』」と呼んでいます。 ISO/IEC 10646-1:2000 附属書 H (参考) The use of “signatures” to identify UCS に説明があります。

This annex describes a convention for the identification of features of the UCS, by the use of "signatures" within data streams of coded characters. The convention makes use of the character ZERO WIDTH NO-BREAK SPACE, and is applied by a certain class of applications.

なんだそーです。使いたけりゃ使えば? 的で結構さめてます。 引用部の後の方の記述によると、

UCS-2 signatureFEFF
UCS-4 signature0000 FEFF
UTF-8 signatureEF BB BF
UTF-16 signatureFEFF

ってことですが、別に UCS-2/4, UTF-8/16 を区別できるのが 嬉しいのじゃなくて、その名の通りバイト順を区別できるのが嬉しいんです。

このように、エンディアンが識別できるんです。素晴らしいでしょ? :-)

だから UTF-8 ではこんなの要らんのですが、一貫性かなんかのために、 つけようというのが当世風。対応してない応用からすると頭にゴミです。 おまけに、 UTF-8 の最大の特徴であった ASCII との互換性を ぶっ飛ばしてしまいます。

ZERO WIDTH NO-BREAK SPACE (ZWNBSP) が U+FEFF に置いてあって、 U+FFFE が「not a character」になってるのは偶然じゃありません。 BOM に使うためにわざわざこう配置したんです。

で、あとから BOM ありなし問題云々で U+FEFFZWNBSP 本来(?)の役目に使うことが出来ない状況になってしまった (ほんとか?) もんですから、 ZERO WIDTH NON-JOINER (だっけ?) とかを別に追加することになったとか。 (そして追加されたとか。) しょーもない話ですなあ。

BOM は必須ですか?

[3] 質問:

BOMって本来必須なものだと思っていたのですけど、そうでもないんですね (<http://www.airemix.com/bbs/> No.148-13)

[2] はい。 >>1 にあるように、原則として必要ありません。

ただし、 UCS を使用する場面などによって、その場面で使用する規格などが BOM を使わなければならないと規定していることあります。 その場合はもちろん必須になります。

UTF-8 と UTF-8n

[4] 質問: UTF-8 の名前に UTF-8UTF-8n があるようなのですが、どう違うのですか。

[5] まずはっきりさせておかないといけないこととして、 UTF-8n という名前はあまり知られていません。ですから、 UTF-8UTF-8n にはっきり使い分けがあるのかというと、そうでもありません。

[6] UTF-8n という名前を提案しているのは、 UnicodeConsortium のそれなりに偉い人 (誰かは忘れた。) のようです。 しかも、その人の文章 (どこにあったか忘れた。 dW かなあ。) では、使い分けが当然であるかのように書いてあります。

しかし、 Unicode や ISO/IEC 10646 の規格票を見ても、そんなことは全然書いてありません。 つまり、両者を使い分ける提案はありますが、標準化団体や世間で受け入れられているものではありません。 また、受け入れられるけはいもありません。

[7] さて、回答ですが、使い分けを提案している人は、 UTF-8nBOM なしの UTF-8 に、 UTF-8BOM ありの UTF-8 に使おうと言っています。

[9] しかし実際には UTF-8 という名前は BOM なしに対して呼ばれることが多いです。 (最近は BOM ありに対して言うことも多くなってきたようです。 (とはいえ、統計は無いので感覚的に、です。))

[8] >>9 のような状況でどうして >>7 のような定義を提案しているのかですが、おそらく BOM ありを普及させたい意図があるのでしょう。

[10] なお、 IETF charset 名 (MIME (電子メイル) や HTTP で使われる。) では UTF-8 だけを定義していて、その内容は BOM はあっても無くてもいい、というものです。

  • [14] 2004-02-17 05:00:41 +00:00 naruse: 結構UTF-8Nって使う人は多いように思いますよ。UNIX系で最初の一行で処理を決めるとき(#!なんちゃら)、BOMがあるとエラーになってしまうため、UTF-8Nでないといけないのです。

[15] >>14 Windows のメモ帳の影響がどれくらいのものかはわかりませんが、 基本的には今も昔も BOM なしの UTF-8 がずっと多いと思います。

ここで問題にされているのは、そのような話ではなくて、 BOM なし/ありの UTF-8 をそれぞれどのような名前で呼ぶかですよね。

  • BOM があってもなくても、どちらも (またはどちらかわからない状態を) UTF-8 と呼ぶ人がいる。
  • BOM があったら UTF-8 と呼び、 BOM がなければ UTF-8N と呼ぶ人がいる。
  • BOM の問題を知らない人がいる。
  • この問題とは関係ないけど、 UTF-8 のことを Unicode と呼ぶ人もいる。

「UTF-8N」といえば BOM なしであることに疑問の余地はありませんが、 「UTF-8」といった時に一般には BOM のあり・なしを断定できないのです。

経験的には、「UTF-8」に対応しているソフトウェアの多くは BOM ありまたは BOM なしのいずれかしか扱えなくて、 BOM なしだけを扱える方がずっと多く、 たまに、 BOM ありで最初に実装したソフトウェアに後から「UTF-8N」 と称して BOM なしを追加することがあるくらいの様に思われます。なんとなく。

メモ

[16] QA/Utf8BomInteropReport - ESW Wiki <http://esw.w3.org/topic/QA/Utf8BomInteropReport> (名無しさん 2006-12-13 12:36:42 +00:00)

[17] I18N Tests: UTF-8 signature 1 <http://www.w3.org/International/tests/sec-utf8-signature-1.html>

[18] BOM は Bomb? | | プログラマ2.0日報 | あすなろBLOG ( 版) <http://blog.pasonatech.co.jp/sugiura/8981.html>

[19] >>18

まあ「BOM が必要」なコンテキストというのは単に

今が移行期だから

ということであるに過ぎません。とっととこういうものは要らなくなるようになってほしいですね。

UTF-16 よとっととなくなれということですね、わかります。

[20] MAMA: Basic document structure - Opera Developer Community ( 版) <http://dev.opera.com/articles/view/mama-basic-document-structure/#boms>

The 3 BOMs were found in a total of 17,649 URLs (0.50% of all URLs analyzed). The BOM found most often is utf-8.

BOMFrequency
utf-817,006
utf-16 (little-endian)647
utf-16 (big-endian)26

[21] PHP スクリプトは BOM 付き UTF-8 で書いてはいけない - れぶろぐ (2009-01-29) (revulo 著, 版) <http://www.revulo.com/blog/20090129.html#p01>

[22] (X)HTML5 Tracking ( 版) <http://html5.org/tools/web-apps-tracker?from=3852&to=3853>

[23] Bug 12897 – In some parsers, UTF-8 BOM trumps the HTTP charset attribute (Encoding sniffing algorithm) ( 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=12897>

[24] Web Applications 1.0 r7360 Make a BOM override HTTP headers. ( ( 版)) <http://html5.org/tools/web-apps-tracker?from=7359&to=7360>

[25] Charinfo — "" ( ( 版)) <http://chars.suikawiki.org/char/FEFF>

[26] Web Applications 1.0 r7782 Strip a leading BOM from scripts in workers, if any. Also, use more of the encoding spec. ( ( 版)) <http://html5.org/tools/web-apps-tracker?from=7781&to=7782>

[27] Re: [Json] JSON: remove gap between Ecma-404 and IETF draft ( (Martin J. Dürst 著, 版)) <http://lists.w3.org/Archives/Public/www-tag/2013Nov/0102.html>

[28] Re: BOMs ( (Bjoern Hoehrmann 著, 版)) <http://lists.w3.org/Archives/Public/www-tag/2013Nov/0119.html>

[29] <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E%0A%3Cscript%3E%0A%20%20var%20p%20%3D%20document.createElement%20(%27p%27)%3B%0A%20%20p.innerHTML%20%3D%20%27%5CuFEFFabcd%27%3B%0A%20%20w%20(p.textContent.length)%3B%0A%3C%2Fscript%3E>Firefox でも Chrome でも5になります。つまり innerHTML の先頭に U+FEFF があっても無視されません。

[30] <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E%0A%3Ciframe%3E%3C%2Fiframe%3E%0A%3Cscript%3E%0A%20%20var%20doc%20%3D%20document.getElementsByTagName%20(%27iframe%27)%5B0%5D.contentDocument%3B%0A%20%20doc.open%20()%3B%0A%20%20doc.write%20(%27%5CuFEFFabcd%27)%3B%0A%20%20doc.close%20()%3B%0A%20%20w%20(doc.body.textContent.length)%3B%0A%3C%2Fscript%3E>Firefox でも Chrome でも5になります。つまり document.open + document.write で新しい文書を作成しても先頭の U+FEFF は無視されません。