【プログラミング】テキスト先頭の隠れた識別子!「BOM付UTF-8(U+FEFF)」|情報処理問題1000本ノック
基本情報技術者試験や応用情報技術者試験のプログラミング・文字コード分野で頻出の重要テーマ。「BOM(Byte Order Mark)」の役割と、UTF-8やUTF-16における挙動の違いを攻略しましょう。
1. 【 問題 】:テクノロジ系(文字コード・データ表現)
【 問題 】 Unicode文字コードのエンコーディング方式に関する記述です。テキストデータの最先頭にバイト順序(エンディアン)や文字コードの識別用として特殊な制御文字「\ufeff(U+FEFF)」を埋め込む仕様を表す用語として、適切なものはどれか。
(ア)UTF-8(BOMなし)
(イ)BOM付UTF-8(UTF-8 with BOM)
(ウ)Base64
(エ)Unicode正規化(NFC)
2. 正解:
正解:(イ)BOM付UTF-8(UTF-8 with BOM)
3. 解説:「『\ufeff』はファイルの先頭に刻む文字コードの印!」
BOM(Byte Order Mark)は、元々はUTF-16やUTF-32などの複数バイト文字コードで「ビッグエンディアンか・リトルエンディアンか」というバイトの並び順(エンディアン)を識別するための仕組みです。
Unicode規格上の文字コード値として **`U+FEFF`** (ZERO WIDTH NO-BREAK SPACE)が割り当てられています。
| 項目 | 仕様・特徴 |
|---|---|
| 先頭の制御記号 | Unicode表記:`\ufeff`(U+FEFF) UTF-8でのバイト列:`0xEF, 0xBB, 0xBF`(16進数3バイト) |
| 本来の目的 | 2バイト単位で処理するUTF-16等でバイトの読み順(エンディアン)を判別するため。 |
| UTF-8での目的・影響 | 1バイト単位処理のため本来エンディアン識別は不要だが、「このファイルはUTF-8である」という目印として使用。ただし、対応していないプログラム(WebサーバやJSONパーサー等)ではパースエラーや想定外の余白バグの原因になる。 |
1. 理解のコツ:
・ExcelなどでCSVファイルを開く際、Shift_JISと誤認されて文字化けするのを防ぐためにBOM付UTF-8(`\ufeff`で始まるファイル)が重宝されます。
・一方で、PythonやNode.jsなどのプログラムでJSONやCSVを読み込む際、先頭の `\ufeff` が「余分な不視記号」として読まれてしまいエラーになるケースがあるため注意が必要です。
2. 試験対策の視点:
問題文に「テキストの先頭」「\ufeff」「0xEF, 0xBB, 0xBF」「文字コードの識別標識」「Byte Order Mark」と来たら、迷わずBOM(BOM付UTF-8)を選択しましょう!
4. まとめ
テキストデータの最先頭に制御文字 `\ufeff`(16進数の `0xEF, 0xBB, 0xBF`)を挿入して文字コードを識別させる仕様。これがBOM付UTF-8です。実務やプログラミングで頻出の文字化け・エラー原因としても確実に押さえておきましょう!