Byte Order Mark に対処する
Posted on Thu 31 January 2019 in misc
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 になりました。