BOMの悪夢再び

各方面から寄せられた多数の苦情によって
メモ帳もデフォルトが UTF-8(BOM無し)となり、
BOM の事など多くの皆が忘れてしまったかのようだった。
BOMは撲滅され世界に平和が訪れたかのように思われた。

だがしかし、悪夢は再び訪れる・・・

using Sample1;

SampleClass sampleClass = new();
sampleClass.SampleMethod();
using System.Text;

namespace Sample1
{
    internal class SampleClass
    {
        public void SampleMethod()
        {
            //BOM付き
            using (StreamWriter sw = new StreamWriter("a.txt", false, Encoding.GetEncoding("UTF-8")))
            {
                sw.WriteLine("マイクロソフトは猛省しなさい。");
            }

            //BOM無し
            using (StreamWriter sw = new StreamWriter("b.txt", false, new UTF8Encoding(false)))
            {
                sw.WriteLine("BOMの無い平和な世界の実現を。");
            }
        }
    }
}

a.txt は BOM を含む。b.txt は BOM を含まない。
前述した a.txt を作成する
ようなコードは書いてはいけない。

(デフォルトでBOM無しの仕様にしとけば良いんだが、そうはなっていない。)

BOM はマイクロソフトが考え出した UTF-8 ファイルの先頭につける符号の事で、
各方面の有識者からマイクロソフトは猛抗議され取り下げた経緯がある。
メモ帳のデフォルトエンコードUTF-8(BOM無し)になったのもその一環である。

しかし BOM は未だに巷に蔓延り猛威を振るっており看過できない。
BOM は忌避すべき符号である。呪われた符号である。撲滅すべき符号である。

テキストファイルをスクリプト等で加工したりする事があり、
BOM が UTF-8 ファイルの先頭に潜んでいるとは限らない。
かつ BOM はエディタでほぼ表示されないのでたちが悪い。
(カーソルを当てれば表示されはするが非常に分かり辛い。視覚的にはまったく見えない。)

さらに悪いことに、BOM 騒動もすっかり下火となった今、
「BOM が怪しいのでは?」となかなか気づきにくい状況に
なりつつあるということだ。

ファイル中に紛れた BOM の恐ろしさを見てもらいたい。
文と文のちょうど間に BOM が潜んでいる。
Emacs で問題のファイルの部分にカーソル当て、右方向に1つずつ移動してみよう。

カーソルを右に移動すると、「マ」の位置になるはずだが・・・

なぜかカーソルが細くなり「マ」の位置には移動しない。これが BOM の正体である。

もう一度カーソルを右へ移動すると「マ」の位置になる。

BOMの部分でカーソルが細くなっているのが、
おわかりいただけただろうか?

こんなもんわかるかーい!
(ノ`Д´)ノ彡┻━┻

これが JSON ファイルで BOM が潜んでいたりすると、Internal Server Error 地獄となる。
何時間もの作業時間が無駄になるのは確実。

こんなの見つけるのは至難の業である。

マイクロソフトに告ぐ。
BOM を導入した事に関して猛省しなさい。
BOM を撲滅する責務を全うしなさい。

こんな符号を導入したせいで、世界中で多くの技術者が
「謎のエラー」に遭遇しハゲそうになっているのである。
由々しき事態である!

まだ BOM は撲滅されてはいない。忌まわしき BOM の存在を忘れてはならない。
BOM が完全に世界から駆逐されるその日まで、われわれの戦いは終わらない。

つづく