Byte Order Mark に対処する

Posted on Thu 31 January 2019 in Make everything as code

Markdown ファイルから HTML ファイルをつくる Python スクリプトが、まあまあ動くようになりました。PC の中にあるテキストファイルを適当に HTML にしていたら、また問題が発生しました。UnicodeEncodeError もまだよくわからないというのに。

Markdown で ATX スタイルの見出しが変換されずそのまま段落として HTML になっていました。ATX スタイルの見出しというのは、行頭にハッシュ # を付けるスタイルの見出しです。こういう見出しです。

# 見出し

この部分がそのまま段落として、次のようになります。

<p># 見出し</p>

期待するところは、このようになることです。

<h1># 見出し</h1>

今回はパッとひらめいたことが正解だったのですぐに直せました。Windows のメモ帳で新規につくったファイルを UTF-8 で保存すると、ファイルの先頭に Byte Order Mark(BOM) が入ります。Markdown で見出しにするときには、行頭に # を付けなければなりませんが、BOM が行頭に入ってしまいます。イメージとしては次のような感じでしょう。

(BOM)# 見出し

解決方法 は、ファイルを読み込みモードで開くときに、エンコードを utf-8-sig にすることです。

with open(filename, encoding='utf-8') as f:
    content = f.read()

utf-8-sig にしておくと、BOM なしのファイルもそのまま開けるそうです。ファイルの大きさが処理に関わるような場合でなければ、 utf-8-sig で OK です。

メモ帳でプログラムを書く人はあまりいないと思いますが、メモを取るときにメモ帳を使って Markdown を書くという人はそれなりに居そうです。ちょっとの量だったら、起動の速いメモ帳が便利でしょう。そんな私に朗報です。「メモ帳」のデフォルト保存形式が BOM なし UTF-8 になりました。