UTF-8とBOMなしのUTF-8の違いは何ですか?


818

UTF-8とBOMなしのUTF-8の違いは何ですか?どちらが良いですか?


77
UTF-8は、BOMよりもコンテンツによって自動検出されます。方法は簡単です。ファイル(または文字列)をUTF-8として読み取ってみて、それが成功した場合、データはUTF-8であると想定します。それ以外の場合は、CP1252(またはその他の8ビットエンコーディング)であると想定します。UTF-8以外の8ビットエンコーディングには、UTF-8で許可されていないシーケンスがほぼ確実に含まれます。純粋なASCII(7ビット)はUTF-8として解釈されますが、結果もそのとおりです。
Tronic

39
大きなファイルのUTF-8コンテンツのスキャンには時間がかかります。BOMは、このプロセスを大幅に高速化します。実際には、多くの場合、両方を行う必要があります。最近の犯人は、まだ多くのテキストコンテンツがUnicodeではないということです。私はまだUnicode(たとえばUTF-8)を実行しているとは言え、コンテンツに異なるコードページを出力するツールにぶつかります。
Jeroen Wiert Pluimers 2013

10
@Tronic この場合、「より良い」とは言えないと思います。環境によって異なります。あなたがいる場合は必ず、すべてのUTF-8のファイルがでマークされていることをBOMチェックするよりもBOMをである「より良い」、それはより速く、より信頼性があるので、道。
mg30rg 2014

32
UTF-8にはBOMがありません。UTF-8ファイルの先頭にU + FEFFコードポイントを配置する場合、それに対処するために特別な注意を払う必要があります。これは、そのようなものが存在しない場合にエンコーディングを「Unicode」と呼ぶような、Microsoftのネーミングライスの1つにすぎません。
tchrist

7
「最新のメインフレーム(およびAIX)はリトルエンディアンUTF-8に対応しています」 UTF-8には終わりがありません。4つのペアまたはグループを特定のシステムの正しい「順序」に配置するために、バイトのシャッフルはありません。UTF-8バイトシーケンスを検出するには、マルチバイトシーケンスの「コードポイント」の最初のバイト(ASCIIの「プレーン」ではないバイト)にMSビットが設定されており、さらに1〜3個すべてが含まれていることに注意してください。連続して重要度の低いビットとそれに続くリセットビット。これらのセットビットの合計数は、そのコードポイントにある1バイト少なく、MSBがすべて設定されます...
SlySven

回答:


773

UTF-8 BOMは、テキストストリーム()の先頭にある一連のバイト0xEF, 0xBB, 0xBF、リーダーがファイルをUTF-8でエンコードされているとより確実に推測できるようにします。

通常、BOMはエンコードのエンディアンを示すために使用されますが、エンディアンはUTF-8とは無関係であるため、BOMは不要です。

よると、Unicode標準UTF-8のファイルのためのBOMはお勧めしません

2.6エンコーディングスキーム

... BOMの使用は必須でも推奨でもありませんが、UTF-8データがBOMを使用する他のエンコード形式から変換される場合、またはBOMがUTF-8署名として使用される場合に発生する可能性があります。 。詳細については、セクション16.8、スペシャルの「バイトオーダーマーク」サブセクションを参照してください。


114
推奨されないかもしれませんが、ヘブライ語変換での私の経験から、BOMはExcelでのUTF-8認識にとって重要な場合があり、Jibrishとヘブライ語の違いを生む可能性があります
Matanya

26
お勧めできないかもしれませんが、「æøå」を出力しようとすると、Powershellスクリプトが不思議に思った
Marius

63
標準で推奨されていないかどうかに関係なく、許可されており、仮定や推測の代替手段ではなく、UTF-8署名として機能するものを用意することを強くお勧めします。Unicode準拠のソフトウェアはその存在に対処できる必要があります。そのため、私は個人的にその使用を奨励しています。
martineau 2013

30
@ bames53:はい、理想的な世界では、テキストファイルのエンコーディングをファイルシステムメタデータとして保存する方が、それを保持するためのより良い方法になります。しかし、現実の世界に住んでいる私たちのほとんどは、プログラムが実行されるOSのファイルシステムを変更できません。そのため、Unicode標準のプラットフォームに依存しないBOM署名を使用することが、最良かつ最も実用的な代替IMHOのように見えます。
martineau 2014年

34
@martineau昨日、UTF-8以外のUTF-8 BOMを持つファイルに遭遇しました(CP936でした)。不幸なことに、UTF-8 BOMによって引き起こされる莫大な量の痛みの原因となっているものは、主にそれに気づいていません。
bames53 14年

243

他の優れた答えはすでにそれに答えました:

  • UTF-8とBOMされたUTF-8の間に公式の違いはありません
  • BOMされたUTF-8文字列は、次の3バイトで始まります。 EF BB BF
  • これらのバイトが存在する場合、ファイル/ストリームから文字列を抽出するときに無視する必要があります。

しかし、これに関する追加情報として、UTF-8のBOMは、文字列がUTF-8でエンコードされている場合に「匂い」を与える良い方法になる可能性があります。

たとえば、データ[EF BB BF 41 42 43]は次のいずれかになります。

  • 正当なISO-8859-1文字列「ABC」
  • 正当なUTF-8文字列「ABC」

したがって、最初のバイトを確認してファイルコンテンツのエンコーディングを認識するのはクールですが、上記の例に示すように、これに依存しないでください。

エンコーディングは、神聖ではなく、知られている必要があります。


60
@Alcott:あなたは正しく理解しました。文字列[EF BB BF 41 42 43]は、バイトの集まりです。解釈方法を選択するには、外部情報が必要です。これらのバイトがISO-8859-1を使用してエンコードされたと思われる場合、文字列は "ABC"です。これらのバイトがUTF-8を使用してエンコードされたと思われる場合、それは「ABC」です。わからない場合は、調べてみる必要があります。BOMは手掛かりになる可能性があります。UTF-8としてデコードされたときに無効な文字が存在しないことも考えられます...結局、何らかの方法でエンコードを記憶/検索できない限り、バイトの配列は単なるバイトの配列です。
paercebal 2011

19
@paercebal ""はラテン1として有効ですが、テキストファイルがその組み合わせで始まることはほとんどありません。ucs2-le / beマーカーÿþとforについても同様です。また、あなたは決して知ることができません。
user877329 2013年

16
@decezeそれはおそらく言語学的に無効です:最初にï(これは問題ありません)、その後に間にスペースのない引用符(問題あり)。¿はスペイン語であることを示しますが、ïはスペイン語では使用されません。結論:それがなくても、確実性をはるかに上回る確実性を持つlatin-1ではありません。
user877329 2013年

20
@userもちろん、それは必ずしも意味がありません。しかし、システムが推測に依存している場合は、ここで不確実性が生じます。一部の悪意のあるユーザーが意図的にこれらの3文字で始まるテキストを送信すると、システムは突然、BOMでUTF-8を参照していると想定し、テキストをUTF-8として扱います。 Latin-1を使用する必要があり、Unicodeインジェクションが行われます。単なる架空の例ですが、確かに可能です。内容、期間によってテキストのエンコーディングを判断することはできません。
だます

40
「エンコーディングは、神聖ではなく、知られているべきです。」問題の核心。+1、良い先生。つまり、コンテンツを標準化して、「常にこのエンコーディングを使用しています。期間。そのように書いてください。そのように読んでください」と言うか、エンコーディングをメタデータとして保存できる拡張フォーマットを開発してください。(後者もおそらく「ブートストラップ標準エンコーディング」を必要とします。「エンコーディングを
通知

135

UTF-8でエンコードされたファイルにBOMを配置するには、少なくとも3つの問題があります。

  1. テキストを保持していないファイルは、常にBOMが含まれているため、空ではなくなりました。
  2. UTF-8のASCIIサブセット内にあるテキストを保持するファイルは、BOMがASCIIではないため、それ自体がASCIIではなくなります。これにより、既存のツールの一部が故障し、ユーザーがそのようなレガシーツールを置き換えることが不可能になる場合があります。
  3. 各ファイルの先頭にBOMがあるため、複数のファイルを連結することはできません。

そして、他の人が述べたように、何かがUTF-8であることを検出するためにBOMを持つことは十分でも必要でもありません:

  • 任意のバイトシーケンスが、BOMを構成する正確なシーケンスで始まる場合があるため、これでは不十分です。
  • UTF-8であるかのようにバイトを読み取ることができるため、これは必要ありません。それが成功した場合、それは定義上、有効なUTF-8です。

8
ポイント1「テキストを保持しないファイルは常にBOMが含まれているため空ではなくなります」について、これは(1)OSファイルシステムレベルを解釈されたコンテンツレベルで統合し、さらに(2)BOMを使用すると、他のすべての空のファイルでもBOM。(1)の実際的な解決策は、(2)を実行しないことです。本質的に、苦情は「BOMを実際には空のファイルに実際に置くことができないため、論理的に空のファイルを(ファイルサイズをチェックすることによって)最も簡単に検出できない」と言えます。それでも目的があるので、それでも良いソフトウェアはそれに対処できるはずです。
乾杯とhth。-アルフ

7
ポイント2について、「ASCIIテキストを保持するファイルは、もはやそれ自体がASCIIではない」、これはASCIIをUTF-8で統合します。ASCIIテキストを保持するUTF-8ファイルはASCIIではなく、UTF-8です。同様に、ASCIIテキストを保持するUTF-16ファイルはASCIIではなく、UTF-16です。等々。ASCIIは7ビットのシングルバイトコードです。UTF-8は、ASCIIの8ビット可変長拡張です。127を超える値が原因で「ツールが故障」した場合、8ビットの世界には適合しません。簡単で実用的な解決策の1つは、ASCII以外のバイト値を分解するツールでASCIIファイルのみを使用することです。おそらくより良い解決策は、これらの良くないツールを捨てることです。
乾杯とhth。-Alf

8
ポイント3に関して、「各ファイルの先頭にBOMがあるため、複数のファイルを連結することはできません」は間違っています。UTF-8ファイルをBOMと連結することに問題はないので、それは明らかに可能です。おそらく、Unixランドでcatクリーンな結果が得られないのではないかと思います。BOM は最初からしかありません。もしそうなら、それcatは解釈されたコンテンツレベルではなくバイトレベルで機能し、同様にcat写真などを処理できないためです。それでもそれほど害はありません。これは、BOMがゼロ幅の改行しないスペースをエンコードするためです。
乾杯とhth。-アルフ14年

20
@ Cheersandhth.-Alfこの答えは正しいです。Microsoftのバグを指摘しているだけです。
tchrist

9
@brighty:bomを追加しても状況は改善されません。
Deduplicator

84

これは実際に実際の問題を引き起こすBOMの使用例ですが、多くの人はそれについて知りません。

BOMはスクリプトを壊します

シェルスクリプト、Perlスクリプト、Pythonスクリプト、Rubyスクリプト、Node.jsスクリプト、またはインタープリターで実行する必要があるその他の実行可能ファイル-すべては、次のいずれかのようなシバン行で始まります。

#!/bin/sh
#!/usr/bin/python
#!/usr/local/bin/perl
#!/usr/bin/env node

このようなスクリプトを呼び出すときに実行する必要があるインタープリターをシステムに通知します。スクリプトがUTF-8でエンコードされている場合、最初にBOMを含めたくなるかもしれません。しかし、実際には「#!」文字は単なる文字ではありません。彼らは実際には魔法の数です、2つのASCII文字で構成されるです。これらの文字の前に何か(BOMなど)を置くと、ファイルには別のマジック番号が付いているように見え、問題が発生する可能性があります。

ウィキペディア、記事:シバン、セクション:マジックナンバーを参照してください:

シバン文字は、拡張ASCIIエンコーディングで同じ2バイトで表されます。UTF-8は、現在のUnixライクなシステムでスクリプトやその他のテキストファイルに一般的に使用されています。ただし、UTF-8ファイルはオプションのバイトオーダーマーク(BOM)で始まる場合があります。「exec」機能がバイト0x23および0x21を明確に検出する場合、シバンの前にBOM(0xEF 0xBB 0xBF)が存在すると、スクリプトインタープリターが実行されなくなります。一部の当局は、POSIX(Unixのような)スクリプトでバイトオーダーマークを使用しないことを推奨しています[14]。この理由と、より広い相互運用性と哲学的な懸念からです。さらに、エンコーディングにエンディアンの問題がないため、UTF-8ではバイトオーダーマークは必要ありません。エンコーディングをUTF-8として識別するためにのみ機能します。【強調追加】

JSONではBOMは不正です

RFC 7159のセクション8.1を参照してください。

実装では、JSONテキストの先頭にバイトオーダーマークを追加しないでください。

BOMはJSONでは冗長です

JSONで違法であるだけでなく、JSONストリームで使用される文字エンコーディングとエンディアンの両方を明確に決定するより信頼できる方法があるため、文字エンコーディングを決定する必要もありません(詳細についてはこの回答を参照してください)。

BOMがJSONパーサーを壊す

これはJSONで違法であり、必要ではないだけでなく、RFC 4627で提示されている方法を使用してエンコードを決定するすべてのソフトウェアを実際に破壊ます

JSONのエンコードとエンディアンを判別し、NULバイトの最初の4バイトを調べます。

00 00 00 xx - UTF-32BE
00 xx 00 xx - UTF-16BE
xx 00 00 00 - UTF-32LE
xx 00 xx 00 - UTF-16LE
xx xx xx xx - UTF-8

これで、ファイルがBOMで始まる場合は、次のようになります。

00 00 FE FF - UTF-32BE
FE FF 00 xx - UTF-16BE
FF FE 00 00 - UTF-32LE
FF FE xx 00 - UTF-16LE
EF BB BF xx - UTF-8

ご了承ください:

  1. UTF-32BEは3つのNULで始まっていないため、認識されません
  2. UTF-32LE最初のバイトの後に3つのNULがないため、認識されません
  3. UTF-16BEの最初の4バイトにはNULが1つしかないため、認識されません
  4. UTF-16LEの最初の4バイトにはNULが1つしかないため、認識されません

実装によっては、これらすべてがUTF-8として誤って解釈され、誤って解釈されるか、無効なUTF-8として拒否されるか、まったく認識されない場合があります。

さらに、私が推奨するように実装が有効なJSONをテストする場合、実際にはUTF-8としてエンコードされている入力でさえ、RFCに従って必要な128文字未満のASCII文字で始まっていないため、拒否されます。

その他のデータ形式

JSONのBOMは不要であり、違法であり、RFCに従って正しく動作するソフトウェアを破壊します。それを使用しないのは当然ですが、BOM、コメント、さまざまな引用ルール、またはさまざまなデータ型を使用してJSONの破壊を主張する人々は常にいます。もちろん、必要に応じてBOMやその他のものを自由に使用できます。その場合は、JSONと呼ばないでください。

JSON以外のデータ形式については、実際の形式を見てください。エンコーディングがUTF- *のみで、最初の文字が128未満のASCII文字である必要がある場合、エンコーディングとデータのエンディアンの両方を決定するために必要なすべての情報がすでにあります。オプション機能としてBOMを追加しても、複雑でエラーが発生しやすくなります。

BOMの他の用途

JSONやスクリプト以外での使用に関しては、ここにはすでに非常に良い答えがあると思います。実際の問題を引き起こすBOM文字の例であるため、スクリプトとシリアライゼーションに関するより詳細な情報を追加したかったのです。


5
rfc4627に取って代わるrfc7159は、実際にBOMをサポートすることはそれほど悪いことではないと示唆しています。基本的に、BOMがないことは曖昧なことです。そのため、Unicodeに対応していない古いWindowsおよびUnixソフトウェアでも、utf-8を処理できます。
エリックグランジ

2
JSONのようなサウンドは、Perlスクリプト、Pythonスクリプト、Rubyスクリプト、Node.jsと同じように、サポートするために更新する必要があります。これらのプラットフォームがサポートを含まないことを選択したからといって、必ずしもBOMの使用が中止されるわけではありません。Appleは数年前からAdobeを殺害しようとしており、Adobeはまだ存在しています。しかし、啓蒙的なポスト。
htm11h 2017

13
@EricGrange、あなたはBOMを非常に強力にサポートしているようですが、これがすべてのユビキタスで、普遍的に有用で、最適な最小の「プレーンテキスト」フォーマットを、UTF8以前の過去の遺物にすることを理解できません!プレーンテキストストリームにあらゆる種類の(帯域内)ヘッダーを追加すると、定義により、必須プロトコルが最も単純なテキストファイルに課され、再び「最も単純」になることはありません。そして何のために?署名なかった他のすべての古いCPエンコーディングをサポートするために、UTF-8と間違える可能性がありますか?(ところで、ASCIIもUTF-8です。それで、それらのBOMもそうですか?;)さあ。)
Sz。

2
この答えが私がこの質問を思いついた理由です!私はWindowsでbashスクリプトを作成し、それらのスクリプトをLinuxに公開するときに多くの問題を経験します!jasonファイルについても同様です。
遠野ナム

2
私はこの答えを約50倍に投票できればいいのにと思います。また、この時点で、UTF-8は標準化戦争に勝っており、インターネット上で生成されるほとんどすべてのテキストはUTF-8です。最も人気のあるプログラミング言語(C#やJavaなど)は内部でUTF-16を使用しますが、それらの言語を使用するプログラマーがファイルを出力ストリームに書き込む場合、ほとんど常にUTF-8としてエンコードします。したがって、UTF-8ファイルをマークするBOMを持つことはもはや意味がありません。UTF-8は読み取り時に使用するデフォルトである必要があり、UTF-8デコードが失敗した場合にのみ他のエンコーディングを試します。
rmunn

51

UTF-8とBOMなしのUTF-8の違いは何ですか?

短い答え:UTF-8では、BOMはEF BB BFファイルの先頭のバイトとしてエンコードされます。

長い答え:

当初、UnicodeはUTF-16 / UCS-2でエンコードされると予想されていました。BOMは、このエンコード形式用に設計されました。2バイトのコード単位がある場合、2バイトの順序を示す必要があります。これを行うための一般的な規則は、データの先頭に「バイトオーダーマーク」として文字U + FEFFを含めることです。文字U + FFFEは永続的に割り当てられないため、その存在を使用して誤ったバイト順序を検出できます。

UTF-8はプラットフォームのエンディアンに関係なく同じバイトオーダーを持っているので、バイトオーダーマークは必要ありません。ただし、(バイトシーケンスとしてEF BB FF)UTF-16からUTF-8に変換されたデータ、またはデータがUTF-8であることを示す「シグネチャ」として発生する場合があります。

どちらが良いですか?

なし。Martin Coteが答えたように、Unicode標準はそれを推奨していません。非BOM対応ソフトウェアで問題が発生します。

ファイルがUTF-8であるかどうかを検出するより良い方法は、有効性チェックを実行することです。UTF-8には有効なバイトシーケンスに関する厳密なルールがあるため、誤検知の可能性はごくわずかです。バイトシーケンスがUTF-8のように見える場合、それはおそらくそうです。


8
これはまた、その中の一つの誤ったバイトで有効なUTF-8を無効になるけれども:/
endolith

8
-1 re「BOMに対応していないソフトウェアで問題が発生します。」これは私にとって問題ではありませんが、逆に、BOMがないとBOMに対応したソフトウェア(特にVisual C ++)で問題が発生します。問題。したがって、このステートメントは非常にプラットフォーム固有であり、Unixランドの狭い視点ですが、一般的に当てはまるかのように誤解を招くように提示されています。それはしません。
乾杯とhth。-アルフ

6
いいえ、UTF-8にはBOMがありません。この答えは間違っています。Unicode標準を参照してください。
tchrist

2
バイトを見ただけで、純粋なASCIIファイルがあると考えることもできます。しかし、これはutf-16ファイルの場合もあり、バイトではなく単語を調べる必要があります。最新のソフトウェアはBOMに注意する必要があります。それでもutf-8の読み取りは、無効なシーケンス、より小さいシーケンスを使用できるコードポイント、またはサロゲートであるコードポイントを検出すると失敗する可能性があります。孤立したサロゲートがある場合、utf-16の読み取りも失敗する可能性があります。
ブライトイ2015

1
@アルフ、BOM以外の態度を「プラットフォーム固有、狭いUnixの観点」と解釈することに同意しません。私にとって、狭い視野が「Unixの土地」にある唯一の方法は、MSとVisual C ++が* NIXの前に来た場合でした。MSは、(私は故意と仮定)UTF-8でBOMを使用し始めたのではなく、UTF-16という事実は、彼らが破壊促進したことを私に示唆shperlg++、および他の多くの自由で強力なツール。機能したいですか?MSバージョンを購入するだけです。MSは、\ x80- \ x95範囲の惨事のように、プラットフォーム固有の問題を引き起こしました。
bballdave025

30

BOMを使用したUTF-8がより適切に識別されます。私はこの結論にたどり着きました。結果の1つがCSVであるプロジェクトに取り組んでいます Unicode文字を含むファイルでます。

CSVファイルがBOMなしで保存された場合、ExcelはそれをANSIであると見なし、意味不明な表示をします。「EF BB BF」を前面に追加すると(たとえば、UTF-8を使用したメモ帳またはBOMを使用したUTF-8を使用したNotepad ++を使用して保存し直すと)、Excelで正常に開きます。

BOM文字をUnicodeテキストファイルに付加することは、RFC 3629で推奨されています:「UTF-8、ISO 10646の変換フォーマット」、2003年11月http://tools.ietf.org/html/rfc3629(この最後の情報は次の場所にあります:http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html


6
Excelで使用するUTF-8ファイルを作成する場合に備えて、この優れたヒントをありがとう。他の状況でも、私は他の答えに従い、BOMをスキップします。
バルフイン2013年

5
ASCIIのみを含むファイルを作成し、後で非ASCIIが追加される可能性がある場合にも役立ちます。私はちょうどそのような問題に遭遇しました:utf8を期待するソフ​​トウェアは、ユーザー編集用のいくつかのデータを含むファイルを作成します。初期ファイルにASCIIのみが含まれていて、一部のエディターで開いて保存すると、最終的にはlatin-1になり、すべてが壊れます。BOMを追加すると、エディターによってUTF8として検出され、すべてが機能します。
Roberto Alsina

1
UTF-8ファイルを正しく認識するためにBOMを必要とする複数のプログラミング関連ツールを見つけました。Visual Studio、SSMS、SoureTree ....
kjbartel 2015年

5
そのRFCにBOMを使用するための推奨事項をどこで読みますか?せいぜい、そうすることが難しい特定の状況下では禁止しないことを強くお勧めします。
Deduplicator 2015

8
ExcelはそれをANSIであると判断し意味不明なことを示しています。問題はExcelにあります。
Isaac

17

BOMは、どこか、どこかでブームになる傾向があります(しゃれた意図はありません(シック))。そして、ブームになると(たとえば、ブラウザー、エディターなどで認識されなくなる)、ドキュメントの先頭に変な文字(HTMLファイル、JSON応答、RSSなど)として表示されます。そして、ツイッターでのオバマ氏の講演中に経験された最近のエンコーディングの問題のような一種の恥ずかしさを引き起こします。

デバッグが難しい場所に表示されたり、テストが無視されたりすると、非常に煩わしくなります。したがって、使用する必要がない限り、それを回避することをお勧めします。


はい、BOMなしのUTF-8ではなくUTF-8としてエンコードされているファイルによって引き起こされる問題の特定に何時間も費やしました。(この問題はIE7でのみ発生したため、かなりガチョウの追跡が行われました。私はDjangoの「include」を使用しました。)
user984003 2013年

将来の読者:私が前述したツイートの問題はBOMに厳密に関連していないことに注意してください。ただし、関連している場合、ツイートは同様の方法で文字化けしますが、ツイートの冒頭にあります。
HalilÖzgür2013

12
@ user984003いいえ、問題はマイクロソフトがあなたを誤解させていることです。UTF-8と呼ばれるものはUTF-8ではありません。BOMなしのUTF-8とは、UTF-8のことです。
tchrist

「シック」が「意図的なしゃれなし」に追加するもの
JoelFan

2
@JoelFanもう思い出せませんが、作者の主張にもかかわらず、このしゃれは意図されていたのではないでしょうか:)
HalilÖzgürOct

17

質問: BOMなしのUTF-8とUTF-8の違いは何ですか?どちらが良いですか?

バイトオーダーマーク(BOM)に関するWikipediaの記事からの抜粋を以下に示します。この質問には確かな答えが得られると思います。

BOMとUTF-8の意味について:

Unicode規格では、BOMUTF-8で許可していますが、その使用を要求または推奨していません。バイト順はUTF-8では意味がないため、UTF-8での唯一の用途は、テキストストリームがUTF-8でエンコードされていることを最初に通知することです。

BOMを使用ない 場合の引数

BOMを使用しない主な動機は、Unicodeに対応していないソフトウェアとの下位互換性です... BOMを使用しない別の動機は、「デフォルト」のエンコーディングとしてUTF-8を推奨することです。

引数 FOR BOMを使用しました:

BOMを使用する場合の議論は、BOMがないと、ファイルが使用している文字エンコーディングを判別するためにヒューリスティック分析が必要になるということです。従来、このような分析は、さまざまな8ビットエンコーディングを区別するために複雑で、エラーが発生しやすく、場合によっては遅くなります。タスクを容易にするために、Mozilla Universal Charset DetectorやUnicode用のInternational Componentsなど、多数のライブラリーを利用できます。

プログラマーは、UTF-8の検出も同様に困難であると誤って想定します(バイトシーケンスの大部分が無効なUTF-8であり、これらのライブラリーがすべてのバイトシーケンスを許可することを区別しようとしているためです)。したがって、すべてのUnicode対応プログラムがこのような分析を実行するわけではなく、代わりにBOMに依存します。

特に、Microsoftコンパイラーとインタープリター、およびメモ帳などのMicrosoft Windows上の多くのソフトウェアは、ASCII文字しか含まれていないか、BOMで始まる場合を除いて、UTF-8テキストを正しく読み取らず、保存時にBOMを先頭に追加します。 UTF-8形式のテキスト。Microsoft Word文書がプレーンテキストファイルとしてダウンロードされると、GoogleドキュメントはBOMを追加します。

、より良いされている WITH または WITHOUT BOM:

IETFは、もしプロトコルのいずれか()は、常にUTF-8を使用し、または(b)使用されているものエンコーディングを示すためにいくつかの他の方法を有し、それは「署名としてU + FEFFの使用を禁止すべきである。」ことをお勧めします

私の結論:

BOM のみを使用は、ソフトウェアアプリケーションとの互換性が不可欠である場合に。

また、参照されているウィキペディアの記事は、多くのMicrosoftアプリケーションがBOMに依存してUTF-8を正しく検出することを示していますが、これはすべての Microsoftアプリケーションに当てはまるわけではないことにも注意してください。たとえば、@ barlopで指摘されているように、UTF-8 でWindowsコマンドプロンプトを使用するtypeと、そのようなコマンドmoreはBOMの存在を予期しません。BOM 存在する場合、他のアプリケーションと同様に問題が発生する可能性があります。


†このchcpコマンドは、コードページ65001を介して(BOM なしで)UTF-8のサポートを提供します。


5
BOMなしに厳格にした方がいいです。私はそれを発見した.htaccessgzip compression説明したようにUTF-8 BOMと組み合わせて提案にBOMのフォローなしUTF-8でエンコードするエンコードのエラー変化を与える、ここで問題を解決
Chetabahana

1
「BOMを使用しないもう1つの動機は、UTF-8を「デフォルト」エンコーディングとして推奨することです。」-これは非常に強力で有効な引数であり、実際にそこで答えを止めることができます!... ;)(あなたが何歳でUTF8以前の時代に苦しむ必要があったのか(言語学者が必死にアルファベットを変えることさえ考えたとき)はわかりませんが、私たちは毎秒私たちが馬鹿に近づいていることをあなたに言うことができます「1つ」を持つ代わりに、メタデータのないすべての古代のシングルバイトエンコーディングの混乱は純粋な喜びです。)
Sz。

BOM(または何か!)を最も単純なテキストファイル形式である「プレーンテキスト」に追加する方法に関するこのコメントも参照してください。これは、最適なユニバーサルテキストエンコーディング形式が「プレーン」および「シンプル」になるのを防ぐことを意味します(つまり、 「オーバーヘッドレス」)!...
Sz。

多くのユーティリティは最初からUnicodeを実際にサポートしていないため、BOMはほとんどLinuxで問題があります(たとえば、コードポイントの途中で喜んで切り捨てられます)。他のほとんどの最新のソフトウェア環境では、(仕様またはメタデータを通じて)エンコーディングが明確でない場合は常にBOMを使用します。
エリックグランジ

9

この質問にはすでに100万と1つの回答があり、それらの多くは非常に優れていますが、BOMを使用する必要がある場合と使用しない場合を明確にしたいと思いました。

前述のように、文字列がUTF-8であるかどうかを判断する際のUTF BOM(バイトオーダーマーク)の使用は、推測に基づいたものです。のような適切なメタデータが利用可能な場合(のようにcharset="utf-8")、すでに何を使用しているのかはわかっていますが、それ以外の場合は、テストしていくつかの仮定を行う必要があります。これには、文字列が由来するファイルが16進バイトコードEF BB BFで始まるかどうかのチェックが含まれます。

UTF-8 BOMに対応するバイトコードが見つかった場合、その確率はUTF-8であると想定できるほど高く、そこから移動できます。ただし、これを推測するように強制された場合、読み取り中に追加のエラーチェックを行うと、問題が発生した場合に備えて良いでしょう。ソースに基づいて入力が間違いなくUTF-8であってはならない場合にのみ、BOMがUTF-8(つまり、latin-1またはANSI)ではないと想定する必要があります。ただし、BOMがない場合は、エンコーディングに対して検証することで、UTF-8であるかどうかを簡単に判断できます。

BOMが推奨されないのはなぜですか?

  1. 非Unicode対応または準拠性の低いソフトウェアは、latin-1またはANSIであると想定し、文字列からBOMを削除しないため、明らかに問題が発生する可能性があります。
  2. 実際には必要ありません(コンテンツが準拠しているかどうかを確認し、準拠するエンコーディングが見つからない場合のフォールバックとして常にUTF-8を使用してください)

いつBOMでエンコードする必要がありますか?

他の方法(文字セットタグまたはファイルシステムメタを介して)でメタデータを記録できず、プログラムがBOMのように使用されている場合は、BOMでエンコードする必要があります。これは、BOMがないものは通常、レガシーコードページを使用していると想定されるWindowsで特に当てはまります。BOMはOfficeなどのプログラムに、このファイルのテキストはUnicodeであることを伝えます。これが使用されているエンコーディングです。

つまり、私が本当に問題を抱えているのはCSVだけです。プログラムに応じて、BOMが必要な場合とそうでない場合があります。たとえば、WindowsでExcel 2007+を使用している場合、データをインポートせずにスムーズに開くには、BOMでエンコードする必要があります。


2
回答の最後のセクションは100%正解です。BOMを使用する唯一の理由は、不明なファイルを解析するためにデフォルトとしてUTF-8を使用しないバグの多いソフトウェアと相互運用する必要がある場合です。
rmunn

8

一部のファイルについては、WindowsであってもBOMがあってはならないことに注意してください。例はSQL*plusまたはVBScriptファイルです。そのようなファイルにBOMが含まれている場合、それらを実行しようとするとエラーが発生します。


8

BOMを使用したUTF-8は、ファイルに実際に非ASCII文字が含まれている場合にのみ役立ちます。それが含まれていて何もない場合は、ファイルをプレーンASCIIとして解釈していた古いアプリケーションが壊れる可能性があります。これらのアプリケーションは、ASCII以外の文字に遭遇すると間違いなく失敗するので、私の意見では、BOMはファイルが可能な場合にのみ追加すべきであり、もはやプレーンASCIIとして解釈されるべきではありません。

BOMをまったく使用しないほうがよいことを明確にしたいと思います。それなしで古いゴミが壊れた場合は追加してください。そのレガシーアプリケーションを置き換えるのは現実的ではありません。

UTF-8のBOMを期待しないでください。


7

BOMのWikipediaページの下部に引用:http : //en.wikipedia.org/wiki/Byte-order_mark#cite_note-2

「BOMの使用は必須でも推奨でもありませんが、UTF-8データがBOMを使用する他のエンコード形式から変換される場合、またはBOMがUTF-8署名として使用される場合に発生する可能性があります。」


2
エンコード元の以前のエンコーディングにBOMがあるかどうかに基づいて、ソフトウェアがBOMあり/なしでUTF-8を使用するかどうかを決定する例はありますか?それは馬鹿げた主張のようです
barlop

7

BOMなしのUTF-8にはBOMがありません。これは、ファイルのコンシューマーがファイルがUTF-8エンコードされているかどうかを知る必要がある(または知っていることから利益が得られる)場合を除いて、BOM付きUTF-8より優れているわけではありません。か否か。

BOMは通常、エンコーディングのエンディアンを決定するのに役立ちます。これは、ほとんどのユースケースでは必要ありません。

また、BOMは、それを知らないか気にしていない消費者にとって不要なノイズ/痛みであり、ユーザーを混乱させる可能性があります。


2
「いずれにしても、グリフごとに8ビットなので、UTF-8を使用する必要はありません。」えーと...いいえ、ASCII-7グリフだけがUTF-8の8ビットです。それを超えると、16、24、または32ビットになります。
Powerlord、2010

3
「BOMは通常、エンコーディングのエンディアンを決定するのに役立ちます。これは、ほとんどのユースケースでは必要ありません。」...エンディアンは、ユースケースに関係なく、UTF-8には適用されません
JoelFan

6

これを別の視点から見てみます。BOM付きのUTF-8の方が良いと思います、ファイルに関する詳細情報を提供する、ているます。問題が発生した場合にのみ、BOMなしでUTF-8を使用します。

私のページで複数の言語(キリル文字も含む)を長い間使用しています。ファイルをBOMなしで保存し、エディターで編集するためにそれらを再度開くと(cherouvimも指摘)、一部の文字が破損しています。

Windowsの従来のメモ帳では、新しく作成されたファイルをUTF-8エンコーディングで保存しようとすると、BOMでファイルが自動的に保存されることに注意してください。

私は個人的に、サーバー側のスクリプトファイル(.asp、.ini、.aspx)をBOM付き保存し.htmlファイルをBOMなし保存しています


4
Windowsクラシックメモ帳に関する優れたヒントをありがとう。私はすでにまったく同じことを見つけるのに少し時間を費やしました。私の結果は、常にWindowsクラシックメモ帳ではなくNotepad ++を使用することでした。:-)
barfuin

madeditを使用することをお勧めします。これは、16進モードで、バイトと文字の間の1:1基準の代わりにutf-8バイトシーケンスを選択した場合に1文字を表示する唯一のエディターです。UTF-8ファイルを認識する16進エディターは、madeditと同じように動作するはずです。
ブライトー2015

@brighty BOMのために1対1は必要ないと思います。それは重要ではありません、utf-8 BOMがefbbbfまたはfffe(間違って読み取られた場合はfffe)であることを認識するのにそれほど時間はかかりません。それらのバイトを単に削除することができます。ただし、ファイルの残りの部分のマッピングがあることは悪くありませんが、バイト単位で削除することもできます
barlop

@barlopファイルのコンテンツがutf-8エンコードされている場合、なぜutf-8 BOMを削除するのですか?BOMは、最新のテキストビューア、テキストコントロール、およびテキストエディタで認識されます。nバイトは1文字になるため、utf-8シーケンスの1対1のビューは意味がありません。もちろん、テキストエディターまたは16進エディターはバイトの削除を許可する必要がありますが、これは無効なutf-8シーケンスにつながる可能性があります。
ブライトイ2018年

@brighty utf-8とbomはエンコーディングで、utf-8とbomはエンコーディングです。cmdプロンプトはbomなしのutf8を使用します。utf8ファイルがある場合chcp 65001、utf8サポート用のコマンドを実行します。これはbomなしのutf8です。これを行うtype myfileと、bomがない場合にのみ正しく表示されます。 文字をファイルaaに出力する場合、echo aaa>a.aまたはecho אאא>a.achcp 65001を使用している場合、BOMなしで出力されます。
barlop 2018年

6

UTF-8でエンコードされた情報を表示したい場合、問題に直面しないかもしれません。たとえば、HTMLドキュメントをUTF-8として宣言すると、ドキュメントの本文に含まれるすべてがブラウザに表示されます。

しかし、これはテキスト、CSVの場合には当てはまりません、WindowsまたはLinuxのいずれかに、およびXMLファイル。

たとえば、WindowsまたはLinuxのテキストファイルは、想像できる最も簡単なものの1つであり、(通常は)UTF-8ではありません。

XMLとして保存し、UTF-8として宣言します。

<?xml version="1.0" encoding="UTF-8"?>

UTF-8として宣言されていても、正しく表示されません(読み取られません)。

シンジケーション用にXMLとして保存する必要があるフランス語の文字を含むデータの文字列がありました。最初からUTF-8ファイルを作成せず(IDEのオプションを変更して「新規ファイルを作成」​​)、またはファイルの先頭にBOMを追加しない

$file="\xEF\xBB\xBF".$string;

フランス語の文字をXMLファイルに保存できませんでした。


1
FTM、XMLでは、ファイルをASCIIとして保持し、代わりにエンティティを使用する必要があると思います。
Alois Mahdal 2013

4
私はこれが古い答えであることを知っていますが、私はそれが間違っていることを述べたいだけです。Linux上のテキストファイル(他のUnixでは話せません)は通常/ are / UTF-8です。
Functino 2015年

6

実用的な違いの1つは、Mac OS X用のシェルスクリプトを作成してプレーンUTF-8として保存すると、応答が得られることです。

#!/bin/bash: No such file or directory

使用するシェルを指定するシバン行に応じて:

#!/bin/bash

UTF-8として保存した場合、BOM(たとえば、BBEdit)はどれも問題ありません。


8
これは、Microsoftが標準の発言の意味を交換したためです。UTF-8にはBOMがありません。データストリームの前に偽のBOMを挿入するMicrosoft UTF-8を作成し、いいえ、これは実際にはUTF-8であると伝えました。そうではない。それは単に拡張して破損しています。
tchrist

4

上記のように、BOMを使用したUTF-8は、BOM非対応(または互換性のある)ソフトウェアで問題を引き起こす可能性があります。クライアントがWYSIWYGプログラムを必要とするため、かつて、MozillaベースのKompoZerでUTF-8 + BOMとしてエンコードされたHTMLファイルを編集しました。

保存すると、必ずレイアウトが破壊されます。これを回避するのに少し時間がかかりました。その後、これらのファイルはFirefoxでうまく機能しましたが、Internet ExplorerでCSSの癖があり、レイアウトが破壊されました。リンクされたCSSファイルを何時間もいじって無駄にした後、Internet ExplorerがBOMfed HTMLファイルを気に入らないことに気付きました。二度と。

また、私はこれをウィキペディアで見つけました:

シバン文字は、UTF-8を含む拡張ASCIIエンコーディングで同じ2バイトで表されます。UTF-8は、現在のUnixライクなシステムでスクリプトやその他のテキストファイルに一般的に使用されています。ただし、UTF-8ファイルはオプションのバイトオーダーマーク(BOM)で始まる場合があります。「exec」機能がバイト0x23 0x21を明確に検出する場合、シバンの前にBOM(0xEF 0xBB 0xBF)が存在すると、スクリプトインタープリターが実行されなくなります。一部の当局は、POSIX(Unixのような)スクリプトでバイトオーダーマークを使用しないことを推奨しています。[15]この理由と、より広い相互運用性と哲学的な懸念から


4

Unicode Byte Order Mark(BOM)FAQは簡潔な答えを提供します:

Q:BOMの扱い方は?

A:ここに、従うべきいくつかのガイドラインがあります。

  1. 特定のプロトコル(.txtファイルに関するMicrosoftの規則など)では、ファイルなどの特定のUnicodeデータストリームでBOMを使用する必要がある場合があります。このようなプロトコルに準拠する必要がある場合は、BOMを使用します。

  2. タグ付けされていないテキストの場合、一部のプロトコルではオプションのBOMが許可されます。それらの場合、

    • テキストデータストリームがプレーンテキストであることがわかっているが、エンコードが不明である場合、BOMを署名として使用できます。BOMがない場合、エンコードは何でもかまいません。

    • テキストデータストリームがプレーンなUnicodeテキストであることがわかっている(ただし、どのエンディアンではない)場合は、BOMを署名として使用できます。BOMがない場合、テキストはビッグエンディアンとして解釈されます。

  3. 一部のバイト指向プロトコルでは、ファイルの先頭にASCII文字が必要です。これらのプロトコルでUTF-8を使用する場合は、BOMをエンコード形式の署名として使用しないでください。

  4. データストリームの正確なタイプがわかっている場合(UnicodeビッグエンディアンやUnicodeリトルエンディアンなど)、BOMは使用しないでください。特に、データストリームがUTF-16BE、UTF-16LE、UTF-32BE、またはUTF-32LEであると宣言されている場合は常に、BOMを使用してはなりません。


1

http://en.wikipedia.org/wiki/Byte-order_markから:

バイトオーダーマーク(BOM)は、テキストファイルまたはストリームのエンディアン(バイトオーダー)を通知するために使用されるUnicode文字です。そのコードポイントはU + FEFFです。BOMの使用はオプションであり、使用する場合は、テキストストリームの先頭に表示する必要があります。BOM文字は、バイトオーダーインジケーターとしてのその特定の用途を超えて、テキストがエンコードされているいくつかのUnicode表現のどれを示しているかもしれません。

ファイルで常にBOMを使用すると、UTF-8およびBOMをサポートするエディターで常に正しく開くことが保証されます。

BOMがないという私の本当の問題は次のとおりです。次の内容を含むファイルがあるとします。

abc

BOMがない場合、これはほとんどのエディターでANSIとして開きます。したがって、このファイルの別のユーザーがファイルを開き、いくつかのネイティブ文字を追加します。次に例を示します。

abg-αβγ

エラーが発生しました。ファイルはまだANSIであり、「αβγ」は6バイトを占めていませんが、3です。これはUTF-8ではなく、開発チェーンの後半で他の問題を引き起こします。


9
BOM非対応ソフトウェアの最初に偽のバイトが現れることを確認します。わーい。
ロメイン

1
@Romain Muller:たとえば、BOMの後にヘッダーを送信しようとすると、PHP 5は「不可能」エラーをスローします。
Piskvorは

5
αβγはASCIIではありませんが、8ビットASCIIベースのエンコーディングで表示できます。BOMを使用すると、utf-8の利点であるasciiとの互換性(純粋なasciiが使用されている遅延アプリケーションで動作する機能)が無効になります。
ctrl-alt-delor 2011年

1
これは間違った答えです。その前にBOMがある文字列は、まったく別のものです。それはそこにあるはずではなく、すべてを台無しにしています。
tchrist

BOMがない場合、これはほとんどのエディターでANSIとして開きます。私は完全に同意します。これが発生した場合、正しいコードページを処理できれば幸運ですが、コードページはファイルの一部ではないので、それは推測にすぎません。BOMです。
ブライトー2015

1

Visual Studio、Sourcetree、およびBitbucketのプルリクエストに関する私の経験は次のとおりです。

そのため、プルリクエストを確認すると、署名付きのBOMの各ファイルに赤いドット文字が含まれていることがわかります(非常に煩わしい場合があります)。

ここに画像の説明を入力してください

それにカーソルを合わせると、「ufeff」のような文字が表示されますが、Sourcetreeはこれらのタイプのバイトマークを表示しないため、プルリクエストで終了する可能性が高くなります。 2017は新しいファイルをエンコードするので、Bitbucketはこれを無視するか、別の方法で表示する必要があります。詳細はこちら:

赤いドットマーカーのBitBucket差分ビュー


-4

HTMLファイルでUTF-8を使用し、同じページでセルビア語のキリル文字、セルビア語のラテン語、ドイツ語、ハンガリー語、またはエキゾチックな言語を使用する場合、BOMを使用したUTFの方が優れています。

それが私の意見です(30年間のコンピューティングおよびIT業界)。


1
これも本当だと思います。最初の255 ASCIIセット以外の文字を使用し、BOMを省略すると、ブラウザはそれをISO-8859-1として解釈し、文字化けします。上記の答えを考えると、これは明らかに、BOMを検出しないときにブラウザーベンダーが間違った動作をしていることが原因です。しかし、Microsoft Edge / Mozilla / Webkit / Blinkで作業しない限り、これらのアプリにある欠陥を処理せざるを得ません。
asontu

UTFって何?UTF-8?UTF-16?他に何か?
Peter Mortensen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.