2009-06-02 95 views
3

目前我有一個用python編寫的簡單IRC bot。Python IRC bot和編碼問題

由於我將它遷移到python 3.0中區分字節和unicode字符串,我開始有編碼問題。具體而言,其他人不發送UTF-8。

現在,我可以告訴所有人發送UTF-8(他們應該不管),但更好的解決方案將嘗試讓Python默認爲其他編碼或類似。

到目前爲止,代碼如下所示:

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

至少不會拋出異常。但是,我想要通過它:我想讓我的機器人默認爲另一種編碼,或嘗試以某種方式檢測「麻煩的字符」。

此外,我需要弄清楚這個mIRC實際使用的神祕編碼是什麼 - 因爲其他客戶端似乎能正常工作併發送UTF-8。

我應該如何去做這些事情?

回答

-1

好吧,經過一番調查發現chardet在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 2009-06-02 13:37:01

3

chardet應該有幫助 - 這是用於檢測未知編碼的規範Python庫。

+0

嘗試,現在。我會看到它在哪裏。 – cwj 2009-06-02 10:57:35

0

作爲RichieHindle提到的,chardet可能是您的最佳解決方案。不過,如果你想覆蓋文本的約90%,你會看到,你可以使用我用:

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

只使用chardet的會導致不良的結果,其中消息很短(這是情況的情況下IRC)。

Chardet結合在整個消息中記住特定用戶的編碼可能是合理的。但是,爲了簡單起見,我會使用一些可能的編碼(編碼取決於文化和時代,請參閱http://en.wikipedia.org/wiki/Internet_Relay_Chat#Character_encoding),如果它們失敗,我會去chardet(如果有人使用某些東亞編碼,這將幫助我們)。

例如:

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')`然後立即放棄。 – 2014-05-02 20:16:38