ウェブから入力されたデータを、WindowsのExcelで開けるcsvファイルに変換しようとして行き詰まった話。
Google日本語入力なんかを使っていると機種依存文字なんかも候補に出てきてしまいますよね。
それを、UTF-8ならまだしも、shift_jisとかcp932(Windowsの日本語拡張エンコーディング)なんかに変換しようとすると、エラーを吐いて終了するわけです。
UTF-8にエンコードしてファイルに出力
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('utf-8'))
f.close()
file.txt
機種♫依存✓文字が⊿含まれています
問題なく出力
cp932で出力
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932'))
f.close()
UnicodeEncodeErrorで終了。
Traceback (most recent call last):
File "test.py", line 6, in
f.write(kishu_izon.encode('cp932'))
UnicodeEncodeError: 'cp932' codec can't encode character u'\u266b' in position 2: illegal multibyte sequence
♫がエンコード出来なかったみたいですね。
こういう時は、エラーを返す文字を無視するか、他の文字(?等)に置き換えて出力すればOK。
encodeの2引数目に'ignore'を指定。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932','ignore'))
f.close()
file.txt
機種依存文字が⊿含まれています
変換できなかった文字は無視して出力されます。
encodeの2引数目に'replace'を指定。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932','replace'))
f.close()
file.txt
機種?依存?文字が⊿含まれています
変換できなかった文字は?に変換されます。
正直言うと、WindowsのExcelがcsvファイルはshift-jisじゃないと開けないとかいう困ったちゃんなのがいけないのです。