Windowsマシンでpythonを使ってutf-8のBOM付きファイルを触る

相変わらずpython文字コードの扱いを腰を据えて勉強しないまま公私共にpythonをガンガン使っているんだが…
当然のように文字列処理でちょこちょこ詰まります。(文字コードの扱いをしっかりやってないので当たり前ですね)


この前はまったのはutf-8形式のテキストファイルにBOMと呼ばれる情報があった場合はpythonでは素直にやっていたのでは読み込めない件。

どういう事かというと…
まずBOMとはバイト・オーダー・マークの略で,Unicodeのデータの先頭数バイトに存在してデータの種類を表すもの。
ところが,符号単位を8bitにとるutf-8はその形式上バイト・オーダー・マークが必要ない。
フォーマットのルールとしては,あっても無くても構わない的な感じになっている。

それは,つまりutf-8のデータの先頭に0xEF, 0xBB, 0xBFというバイト・オーダー・マークがあったりなかったりするという事となる。

で,pythonutf-8のファイルに対してバイト・オーダー・マークは無いものとして扱う。というかあったら駄目的な…
rubyとかはあってもなくても構わない的な扱い)
逆にMicrosoft社なんかは律儀にutf-8のデータにはバイト・オーダー・マークをしっかり入れてくれている。

そんなわけでWindows上では特に,テキストファイルを単純にutf-8で読み込んで表示させようとするとこんなエラーが出やすい。

 UnicodeEncodeError: 'cp932' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

解決策として,読み込む側のpythonのコードをこんな感じにしてあげればOK

def GetFileTextArray(path):
    import codecs
    text_array = []
    for line in codecs.open(path,"r",'utf-8-sig')
       text_array.append(line)
    return text_array

解決策は実にシンプルでcodecsライブラリの方にutf-8-sigを指定してあげる。
そうすると"あっても無くても"いいように読み込んでもらえる。