VC9とutf-8 (BOM付きUTF-8)

VC9とutf-8 (BOM付きUTF-8)

Microsoft Visual C++ Compiler for Python 2.7 (VC9) についての数日前の投稿(これこれ)に関係して、ソースコードの日本語エンコーディングの話。

まずは動画をみてくらはい

以下動画、小さいですが、ブラウザのほうのズーム(Chromeとかなら Ctrl + マウスホイール)で多少見やすくなるかと。

「utf-8になぜに BOM (Byte Order Mark)が必要なのよ」問題はともかくとして、IDE のない Microsoft Visual C++ Compiler for Python 2.7 でもこの知識さえあれば、どうにかなります、って話でした。

細かすぎて伝わらない選手権

ビデオの解像度がいまひとつなので、読みにくかったかもしれない、ポイントとなる部分は、ここに貼り付けときます。

まず、「バイナリファイルとして16進ダンプ」(16進というよりは quoted-printed)してる部分:

1 import quopri
2 print(quopri.encodestring(open("test2.cpp", "rb").read()))

これにより、ファイルの先頭3バイトに BOM が入っているのを見てるわけですな。

それから、標準的 utf-8 (test1.cpp) を BOM 付き utf-8 に変換している部分は、

1 import codecs
2 codecs.getwriter("utf-8-sig")(open("test3.cpp", "wb")).write(
3     open("test1.cpp", "rb").read().decode("utf-8"))

としてます。

動画で一気にみせるがためにこんなプログラムにしてますが、無論

1 import codecs
2 with codecs.getwriter("utf-8-sig")(open("test3.cpp", "wb")) as fo:
3     fo.write(open("test1.cpp", "rb").read().decode("utf-8"))

とかして読みやすく書くのだぞ。さすれば「一括処理」の道は開かれん、っと。

移植性、の話

自分で検証はしていないが、今の gcc は utf-8-sig を知っているらしく、なので、「移植性のために utf-8-sig にするのが現状は良い」と言っている人はいた。苦肉の策だよな。

ちなみに、動画では emacs-24.2-20121208 (Windows 版バイナリ) を使っているために、emacs が utf-8-sig を知ってますが、Meadow 2 も 3 も(ワタシの知っている unicode 環境では) utf-8-sig を知らないくせになまじ制御文字を表示しちゃうがために、ファイルの先頭にゴミが入ってるようにみえます。

つまりな、「utf-8-sig を知らないエディタ」のうち、非文字をなんらか表示してしまうエディタがあるので、誤って編集で消してしまう可能性が高いのね。だので、個人的には「移植性のために utf-8-sig にするのが現状は良い」はどうかなぁ、と思う。

前提を書き忘れた

デフォルトのエンコーディング、つまり日本語版Windowsでの「cp932」(コードページ932)で困らないなら困らなくて良いのれす。あくまでも「utf-8を使いたい」ときの話ね。