utf-16の悲劇


utf-16の世間の扱いがひどすぎる件
http://d.hatena.ne.jp/yaneurao/20100606#p7


前回記事↑の続き。


C#のStreamReaderでencodingを指定しない場合、utf-8utf-16かなら自動判別して正しく読み込める。sjisutf-8と認識されるので正しく読み込めない。しかしこのときutf-16はBOMがついていないとutf-8だとみなされてこれまた正しく読み込めない。


すなわち、encodingとかあまり意識していない人のプログラムに正しく読み込ませるにはutf-8かBOM付きutf-16でなければならない。


ところが、
テキストファイル一つ作るの時間がかかりすぎる
http://d.hatena.ne.jp/yaneurao/20100606#p1
のようにテキストファイルを新規作成して、それを秀丸で開いて編集した場合、新規に作成されたファイルは空(0バイト)である。これを秀丸で開くとencodingはどうなるのか。秀丸の設定でエンコードは自動判別にしているが、判定の順位としてutf-16を最優先にしているので、このファイルはutf-16とみなされる。ところが0バイトであるということは当然BOMはついていない。ゆえにこれはBOMなしutf-16のファイルとしてオープンされる。


秀丸で編集後、保存した場合、そのままのencodingで保存されるので、BOMなしのutf-16のファイルが出来上がり、見事にC#のStreamReaderで読み込みに失敗する。


BOMなしutf-16がencodingの指定を省略して正しく読めないC#(.NET)のStreamReaderが悪いのか、それとも0バイトのファイルを開いたときにBOMなしutf-16とみなしてしまう秀丸が悪いのか。