pythonでUTF8→S-JIS変換?結局UTF8のまま。
HyperEstraierのindex(その3)でチェンジセットのログをファイルにするpythonスクリプトを
作ったのですが、途中でこけることがありました。
調べたら、Subversionのログ(UTF8)をS-JISに変換している部分で
ERRORになってました。つまり、
log=unicode(log,'utf-8').encode('Shift_JIS')
のようにしてました。しかしUnicodeEncodeErrorと。なんだかS-JISにない文字に
変換しようとしてるとか言ってるみたいです。例えば、「繋」ぎ込みが該当。本当は、
UTF8→S-JIS
としたいけど、pythonでは、
UTF8→unicode→S-JIS
のようにするしかない(のかな)。ファイルはS-JISにしないといけないと思うんだけど。
unicodeをはさむからだめなんでしょうか。S-JISには絶対あるはずの文字なんですけど。
S-JISをcp932に変えてみましたがだめ。
調べてみたら、
log=unicode(log,'utf-8')
s = ""
for c in log:
try:
c.encode("cp932")
except UnicodeEncodeError:
s += "?"
else:
s += c
log=s
のようにしたらerrorがでないとのこと。つまり、1文字ずつ変換するということ。
試すとerrorはでないけど、変換できないところは「?」に置き換わる。
さらに調べるとmbcs(Multiple Byte Character Set、
1文字が複数バイトで表現される文字とのこと)についての記述を見つけました。でも、
log=unicode(log,'utf-8').encode("mbcs")
ではやっぱりERROR。ためしに、
log=unicode(log,'utf-8')
s = ""
for c in log:
try:
c.encode("mbcs")
except UnicodeEncodeError:
s += "?"
else:
s += c
log=s
しかしこの方法ならちゃんと変換できました…?
秀丸エディタで開いてみると…、「UTF-8」じゃん。
でもestcmd gatherしてtracから検索してみると…、検索できます!
xdoc2txtあたりでS-JISにしてるのかな?
というわけで、何もせず、UTF8のまま使うことに。
SearchHyperEstraierに機能追加してみました。を修正しました。
| 固定リンク
「trac」カテゴリの記事
- tracdを使ってみる(2011.11.05)
- excelreportexportプラグインのtrac0.12対応(2010.09.23)
- subversionのコミットログを検索して置換(2010.09.02)
- windowsでtrac 0.12を試す(その4)(2010.08.22)
- trac0.12無理やり対応PeerReviewPlugin修正版(2010.08.20)
「TracLightning」カテゴリの記事
- tracdを使ってみる(2011.11.05)
- excelreportexportプラグインのtrac0.12対応(2010.09.23)
- subversionのコミットログを検索して置換(2010.09.02)
- windowsでtrac 0.12を試す(その4)(2010.08.22)
- trac0.12無理やり対応PeerReviewPlugin修正版(2010.08.20)
「python」カテゴリの記事
- subversionのコミットログを検索して置換(2010.09.02)
- pySerial/pyWin32でシリアル通信、でも受信が…(2009.10.21)
- pythonでUTF8→S-JIS変換?結局UTF8のまま。(2009.04.02)
- SQLite DBの変更作業をしてみました(2009.02.19)
この記事へのコメントは終了しました。
コメント
例外を拾わなくても?で置換するだけなら、
unicode(foo, 'utf8', 'replace') や foo.decode('utf8', 'replace')
みたいな感じで行けますよ(`・ω・´)
また、以前私もUTF8からShiftJISへの変換をしたことがあるのですが、
ぱっと見問題無い感じに見えても異字体?で実際は変換できないみたいな
漢字が結構ありました(´・ω・`)
投稿: lamb | 2009年5月29日 (金) 11時41分
そうなんですか。
あとで試してみます。
ありがとうございました。
投稿: tag | 2009年6月 2日 (火) 00時59分