UnicodeEncodeError:でハマる
Pythonのコードをテストする時はコマンドプロンプト上で実行結果を確認しながらの作業をしているんだけど、ある実行結果を表示する部分で
UnicodeEncodeError: 'cp932' codec can't encode character u'\u2014' in position 21: illegal multibyte sequence
というエラーで失敗する。
どうやら文字エンコーディングの関係だという事は分かったが、どうすれば解決するのか分からない。。。
そこで、色々調べていたら[Java]文字エンコーディング毎のUnicodeマッピングの違いについて。という場所にたどり着き、そこにあった表を引用させて貰うと、
字形 | ¢ | £ | ¬ | ‖ | − | 〜 | ― | 〜(JIS X 0212) | |
マッピング | Windows-31J, MS932 |
\uFFE0 | \uFFE1 | \uFFE2 | \u2225 | \uFF0D | \uFF5E | \u2015 | − |
SJIS | \u00A2 | \u00A3 | \u00AC | \u2016 | \u2212 | \u301C | \u2014 | − | |
EUC-JP | \u00A2 | \u00A3 | \u00AC | \u2016 | \u2212 | \u301C | \u2014 | \uFF5E | |
EUCJP-OPEN | \u00A2 | \u00A3 | \u00AC | \u2016 | \u2212 | \u301C | \u2014 | \uFF5E |
RSSをパースしているexpatの文字コードがUTF-8なのだが、出力するコードページはcp932。
ここで、Unicodeマッピングの不整合が発生し、UnicodeEncodeError が起きていると推測。
そこで、解決策には心許ないがマッピングの異なる文字の場合、該当の文字を replace して出力という流れにすることで、出力時のエラーを回避することができた。
これは、コマンドプロンプト出力がcp932によるもので、
Web[EUC-JP] → Python[Unicode] → 出力[cp932]
この時に起こるようだ。
ネットでPythonの文字エンコーディングの問題を検索すると、かなりヒットする。みんなも同じ問題に直面したに違いない。
しかも、Pythonの文字コード、エンコーディング問題は結構「鬼門」らしい。
いいかげん、Unicodeで統一してほしい。
できなくとも、Unicodeマッピングは他のと統一してよ M$さん。--;
その場しのぎな解決コードです。すいません。
「―」用replace
output_ok_str = output_ng_str.replace(u"\u2014", u"\u2015").encode('cp932')「¢、£、¬、‖、−、〜」についても同じようにreplaceを掛けてやる。