ファイルを UTF-16 として保存すると、各値は 2 バイトになります。コンピューターが異なれば、使用するバイト順序も異なります。最上位バイトを最初に配置するものもあれば、最下位バイトを最初に配置するものもあります。Unicode は、バイト オーダー マーク (BOM) と呼ばれる特別なコードポイント (U+FEFF) を予約しています。プログラムが UTF-16 でファイルを書き込むとき、この特別なコードポイントをファイルの先頭に置きます。別のプログラムが UTF-16 ファイルを読み取ると、そこに BOM があるはずであることがわかります。実際のバイトを予想される BOM と比較することで、リーダーがライターと同じバイト順序を使用しているかどうか、またはすべてのバイトを交換する必要があるかどうかを判断できます。
UTF-8 ファイルを保存すると、バイト オーダーにあいまいさはありません。ただし、一部のプログラム、特に Windows 用に作成されたプログラムでは、依然として UTF-8 としてエンコードされた BOM が追加されます。BOM コードポイントを UTF-8 としてエンコードすると、0xEF 0xBB 0xBF の 3 バイトが得られます。これらのバイトは、ほとんどの OEM コード ページ (Windows のコンソール ウィンドウの既定値) のボックス描画文字に対応します。
これを行うことを支持する議論は、他のネイティブエンコーディングとは対照的に、ファイルを真の UTF-8 としてマークすることです。たとえば、西側の Windows の多くのテキスト ファイルはコードページ 1252 です。UTF-8 でエンコードされた BOM でファイルにタグを付けると、違いを見分けやすくなります。
これを行うことに対する議論は、多くのプログラムが ASCII または UTF-8 を期待しており、余分な 3 バイトを処理する方法がわからないということです。
UTF-8 を読み取るプログラムを作成する場合、最初にこの 3 バイトを正確にチェックします。それらがそこにある場合は、それらをスキップしてください。
更新:U+FEFF ZERO WIDTH NO BREAK
ファイルの先頭を除いて文字を 変換できU+2060 WORD JOINER
ます [Gillam, Richard, Unicode Demystified , Addison-Wesley, 2003, p. 108]。私の個人的なコードはこれを行います。UTF-8 をデコードしているときに、ファイルの先頭に 0xEF 0xBB 0xBF が表示される場合は、本当に UTF-8 を持っていることを嬉しく思います。ファイルがこれらのバイトで始まらない場合は、通常どおりデコードを続行します。ファイルの後でデコード中に U+FEFF に遭遇した場合、U+2060 を発行して続行します。つまり、U+FEFF は BOM としてのみ使用され、非推奨の意味としては使用されません。