エンコードのUTF-8はBOM付とBOM無しがあるらしく、BOMの有無が原因で実行結果が異なる場合もあるようです。
ここで学習のおさらいとして、表層的な知識をまとめてみました。
BOMとはなんぞや?
BOMは「Byte Order Mark」の略で、Unicode(統一文字コード)の符号化形式で符号化したテキストの先頭に付与される数バイトのデータです。
ちなみに、Unicodeとは「文字セット(符号化文字集合)」と呼ばれるもので、使用する文字の定義です。
このUnicodeの各文字に番号を割り当てるのが、「UTF-8」を始めとする「文字コード(符号化形式)」になります。
BOMをさらに詳しく説明すると、例えば「あ」という文字をコンピューター上で送る場合、
- 01111000
- 11001100
- 11100001
- 11100010
という4つの組み合わせのデータで「あ」を表すとします。(2進数のデータは適当です)
この場合上記の4つのデータを送る、あるいは受け取る順番というものがあります。
例えばリストの上から順番に送るのか、反対に逆から送るのか、この送る順番を表すものが「Byte Order Mark」になります。
このBOMの有無によって、どの種類の符号化形式を採用しているのかを判別しています。
BOMを付与する一般的なケース
Windowsアプリケーション(excelやメモ帳など)は、BOM付でなければunicodeなどの符号化形式を判断できない場合があります。
その結果、BOMがついていないデータにも係わらず、BOMがついているとアプリケーションに判断されて文字化け等を起こしてしまう場合があります。
なぜMicrosoftがBOM付きを推奨するのかは私にもわかりません。
※現在はBOM無しにも対応していきているようです。(2021/2/15 現在)
BOMを付与しないケース
反対にBOMを付与すべきでないケースは、Webページとして使用されるHTMLファイルなどです。(BOM無しのUTF-8をUTF-8Nとも呼びます)
これはWebページを動的に処理するPHPなどのプログラムが、BOM付のテキストファイルを正常に処理することができないからです。
ちなみに本来「UTF-8」は、「ISO(国際標準化機構)」によりデータの読み書きの順番が決まっているので、BOMをつける必要はありません。
しかしWindows等ではBOM付きのファイルとして認識されることが多いので、BOMをつけておいた方が無難です。
まとめ
- Windowsで文字化けしたらBOMをつけてみよう!
特にWebページをWindowsで作る際は、charasetの指定を忘れないようにしよう! - Linux・UnixなどでWebページを作る際は、BOMをつけようないようにしよう!