2009-06-02 7 views
3

現在、私はpythonで書かれた簡単なIRCボットを持っています。Python IRCボットとエンコーディングの問題

バイトとユニコード文字列を区別するpython 3.0に移行して以来、私はエンコーディングの問題を持ち始めました。具体的には、UTF-8を送信しない他のユーザー。

今私は皆にUTF-8を送ってもらうように指示することができますが、もっと良い解決策は、Pythonを他のエンコードなどにデフォルト設定しようとすることです。少なくとも例外をスローしません

data = str(irc.recv(4096),"UTF-8", "replace") 

これまでのコードは次のようになります。しかし、私はそれを過ぎて行きたい:私はボットが別のエンコーディングにデフォルトするか、何とか "面倒な文字"を検出しようとします。

また、mIRCが実際に使用するこの神秘的なエンコーディングが実際にどのようなものかを理解する必要があります。他のクライアントがうまく動作し、UTF-8を送信するように見えるからです。

これらの作業を行うにはどうすればよいですか?

答えて

-1

[OK]をいくつかの研究の後に、シャーデットがpython 3で問題を抱えていることが判明しました。それが判明したソリューションは、私が思ったより簡単です。私はUTF-8で切断しないとCP1252に戻ってきました。

data = irc.recv (4096) 
try: data = str(data,"UTF-8") 
except UnicodeDecodeError: data = str(data,"CP1252") 

これは動作しているようです。それはエンコーディングを検出しませんが、誰かがUTF-8でもCP1252でもないエンコーディングを持っていたら、もう一度問題が発生します。

これはほんの一時的な解決策です。

+1

cp1252はゼロ以外のすべてのバイト値にコードポイントを割り当てるため、ゼロ以外のバイトシーケンスに対しては常に動作するように見えます。 – RichieHindle

3

chardetこれは、未知のエンコーディングを検出するための正規のPythonライブラリです。

+0

は今それをしようとしています。私はどこに行くのか分かります。 – cwj

0

おそらく、ChardetはRichieHindleが言及したように、あなたの最高の解決策になるでしょう。のみchardetを使用して

def decode(bytes): 
    try: 
     text = bytes.decode('utf-8') 
    except UnicodeDecodeError: 
     try: 
      text = bytes.decode('iso-8859-1') 
     except UnicodeDecodeError: 
      text = bytes.decode('cp1252') 
    return text 


def encode(bytes): 
    try: 
     text = bytes.encode('utf-8') 
    except UnicodeEncodeError: 
     try: 
      text = bytes.encode('iso-8859-1') 
     except UnicodeEncodeError: 
      text = bytes.encode('cp1252') 
    return text 
0

メッセージがケースがである(短い状況のために悪い結果につながる:あなたがテキストの約90%をカバーしたい場合は、あなたは、私が使用しているものを使用することができます表示されますIRC)。

メッセージ全体で特定のユーザーのエンコーディングを覚えているChardetは理にかなっています。しかし、簡単にするために、いくつかの推定エンコーディング(文化とエポックに依存するエンコーディング、http://en.wikipedia.org/wiki/Internet_Relay_Chat#Character_encodingを参照)を使用し、失敗した場合、私はシャーデットに行きます(東アジアのエンコーディングを使用すると、これが私たちを助けます)。例えば

def decode_irc(raw, preferred_encs = ["UTF-8", "CP1252", "ISO-8859-1"]): 
    changed = False 
    for enc in preferred_encs: 
     try: 
      res = raw.decode(enc) 
      changed = True 
      break 
     except: 
      pass 
    if not changed: 
     try: 
      enc = chardet.detect(raw)['encoding'] 
      res = raw.decode(enc) 
     except: 
      res = raw.decode(enc, 'ignore') 
return res 
+0

これは 'res = raw.decode( 'U')'を実行しようとした後すぐに放棄します。 –

関連する問題