« HyperEstraierのindex(その3) | トップページ | puppy linux マイクを有効にする »

2009年4月 2日 (木)

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に機能追加してみました。を修正しました。

|

« HyperEstraierのindex(その3) | トップページ | puppy linux マイクを有効にする »

trac」カテゴリの記事

TracLightning」カテゴリの記事

python」カテゴリの記事

コメント

例外を拾わなくても?で置換するだけなら、
unicode(foo, 'utf8', 'replace') や foo.decode('utf8', 'replace')
みたいな感じで行けますよ(`・ω・´)

また、以前私もUTF8からShiftJISへの変換をしたことがあるのですが、
ぱっと見問題無い感じに見えても異字体?で実際は変換できないみたいな
漢字が結構ありました(´・ω・`)

投稿: lamb | 2009年5月29日 (金) 11時41分

そうなんですか。
あとで試してみます。
ありがとうございました。

投稿: tag | 2009年6月 2日 (火) 00時59分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: pythonでUTF8→S-JIS変換?結局UTF8のまま。:

« HyperEstraierのindex(その3) | トップページ | puppy linux マイクを有効にする »