Windowsマシンでpythonを使ってutf-8のBOM付きファイルを触る
相変わらずpythonの文字コードの扱いを腰を据えて勉強しないまま公私共にpythonをガンガン使っているんだが…
当然のように文字列処理でちょこちょこ詰まります。(文字コードの扱いをしっかりやってないので当たり前ですね)
この前はまったのはutf-8形式のテキストファイルにBOMと呼ばれる情報があった場合はpythonでは素直にやっていたのでは読み込めない件。
どういう事かというと…
まずBOMとはバイト・オーダー・マークの略で,Unicodeのデータの先頭数バイトに存在してデータの種類を表すもの。
ところが,符号単位を8bitにとるutf-8はその形式上バイト・オーダー・マークが必要ない。
フォーマットのルールとしては,あっても無くても構わない的な感じになっている。
それは,つまりutf-8のデータの先頭に0xEF, 0xBB, 0xBFというバイト・オーダー・マークがあったりなかったりするという事となる。
で,pythonはutf-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を指定してあげる。
そうすると"あっても無くても"いいように読み込んでもらえる。