バイト順マークを使用する
Unicode テキスト ファイルは、UTF-8、UTF-16、UTF-32 など、いくつかの形式でエンコードできます。 これらの各形式には、テキストの書き込み時に使用されるバイト順序を示すバイト順マーク (BOM) をプレフィックスとして付けることができます。 使用可能なバイト順マークを次の表に示します。 UTF-8 の場合、バイトは 1 つの順序でしか使用できないので、バイト順マークは省略可能です。 UTF-16 および UTF-32 の場合、バイト順マークが必要です。これらの形式はバイト順序に依存するためです。
Note
バイト順マークは、テキストのバイト順を選択する制御文字ではありません。
バイト順マーク (BOM: Byte Order Mark) | 説明 |
---|---|
EF BB BF | UTF-8 |
FF FE | UTF-16、リトル エンディアン |
FE FF | UTF-16、ビッグ エンディアン |
FF FE 00 00 | UTF-32、リトル エンディアン |
00 00 FE FF | UTF-32、ビッグエンディアン |
Note
従来の Microsoft 製品では、Unicode に対して、Windows-1252 または UCS-2 (UTF-16 で固定)、リトル エンディアン バイト順を使用します。 新しいアプリケーションの場合は、UTF-8 が推奨されます。
理想は、すべての Unicode テキストが 1 セットのみのバイト順規則に従うことです。 ただし、マイクロプロセッサは下位バイトの配置が異なるため、これは不可能です。 Intel および MIPS プロセッサは下位バイトを最初に配置し、Motorola プロセッサ (およびすべてのバイト反転 Unicode ファイル) は最後に配置します。 バイト順規則のセットが 1 つだけの場合、あるタイプのマイクロプロセッサのユーザーは、別のマイクロプロセッサに基づいてファイルが別のオペレーティング システムに転送されていなくても、プレーン テキスト ファイルの読み取りまたは書き込みが行われるたびに、バイト順のスワップを強制します。
バイト順を指定する推奨場所はファイル ヘッダーにありますが、テキスト ファイルにはヘッダーがありません。 したがって、Unicode では文字 (U+FEFF) と非文字 (U+FFFE) がバイト順マークとして定義されています。 これらは互いのミラー バイト イメージです。
通常の Unicode 以外のテキスト ファイルの先頭ではシーケンス U+FEFF は非常にまれであるため、ファイルを Unicode ファイルとして識別するための暗黙的なマーカーまたはシグネチャとして機能できます。 Unicode テキスト ファイルと Unicode 以外のテキスト ファイルの両方を読み取るアプリケーションでは、ファイルが Unicode ファイルである可能性が最も高いインジケーターとして、このシーケンスの存在を使用する必要があります。 この手法を、MS-DOS EOF マーカーを使用してテキスト ファイルを終了する方法と比較します。
アプリケーションがテキスト ファイルの先頭で U+FEFF を検出すると、通常、ファイルは Unicode ファイルとして処理されますが、検証のためにさらにヒューリスティック チェックを実行できます。 このようなチェックは、下位バイトの変動が上位バイトの変動よりもはるかに大きいかどうかを調べるテストと同じくらい簡単です。 たとえば、ASCII テキストが Unicode テキストに変換される場合、2 バイトごとに 0 になります。 また、ラインフィード文字とキャリッジ リターン文字 (U+000A および U+000D) と偶数または奇数のファイル サイズの両方をチェックすると、ファイルの性質を強く示すことができます。
アプリケーションがテキスト ファイルの先頭で U +FFFE を検出すると、ファイルがバイト反転 Unicode ファイルであることを意味すると解釈されます。 アプリケーションは、バイトの順序を入れ替えるか、エラーが発生したことをユーザーに警告することができます。
Unicode バイト順マーク文字はどのコード ページでも見つからないため、データが ANSI に変換されると消えます。 他の Unicode 文字とは異なり、変換時に既定の文字に置き換えられるわけではありません。 ファイルの途中でバイト順マークが見つかった場合、Unicode 文字として解釈されず、テキスト出力には影響しません。
Note
Unicode 値 U + FFFF はプレーン テキスト ファイルでは無効であり、アプリケーション間で渡すことはできません。 これは、アプリケーションのプライベート使用のために予約されています。
関連トピック