簡體   English   中英

將數據從新聞提要傳遞到IRC服務器時,如何正確處理編碼

[英]How can I handle encoding properly when passing data from a news feed to an IRC server

碼:

import socket, feedparser

feed = feedparser.parse("http://pwnmyi.com/feed")
latest = feed.entries[0]
art_name = latest.title

network = 'irc.rizon.net'
port = 6667
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
irc.connect((network, port))
print irc.recv(4096)
irc.send('NICK PwnBot\r\n')
irc.send('USER PwnBot PwnBot PwnBot :PwnBot by Fike\r\n')
irc.send('JOIN #pwnmyi\r\n')
while True:
    data = irc.recv(4096)
    if data.find('PING') != -1:
        irc.send('PONG ' + data.split() [1] + '\r\n')
    if data.find( '!latest' ) != -1:
        irc.send('PRIVMSG #pwnmyi :Latest Article: ' + art_name + '\r\n')

它連接等等,但是當我在通道中執行最新時,它就退出了:

    irc.send('PRIVMSG #pwnmyi :Latest Article: ' + art_name + '\r\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 55: ordinal not in range(128)

您能幫我調試這段代碼嗎? 它曾經為我工作。

IRC協議沒有定義用於消息的特定字符集編碼,而是一種8位協議,其中包含用於控制字符的某些八位位組。 (請參閱rfc1459第2.2節

顯然 ,流行的mIRC客戶端會識別utf8序列,從而對utf8序列進行解碼,這對於irc的使用來說是相當不錯的意義,因為ascii代碼點的編碼字節與ascii字符相同,並且非ascii代碼點的所有字節均編碼為值> 127。

在python中,它的拼寫是unicode.encode(encoding='utf8')如下所示:

>>> u'\u0ca0_\u0ca0'.encode('utf8')
'\xe0\xb2\xa0_\xe0\xb2\xa0'

我個人建議將所有字符串轉換為'utf-8',您可以使用以下方式對Unicode字符串進行編碼/解碼:

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

這是一個解釋Python Unicode的優秀網站: http : //farmdev.com/talks/unicode

最好的3個技巧是:

  1. 盡早解碼
  2. 到處都是Unicode
  3. 后期編碼

您必須對發布到IRC服務器的字符串進行編碼。 另外,根據feedparser返回的內容,您可能希望通過特定的編碼對其進行解碼。

編碼取決於提要中包含的內容。

latest.title包含非ASCII字符。

您必須刪除它們,對其進行轉義或翻譯。

便宜而簡單的方法是使用repr()

    irc.send('PRIVMSG #pwnmyi :Latest Article: ' + repr(art_name) + '\r\n')

或更好

    irc.send('PRIVMSG #pwnmyi :Latest Article: {0!r}\r\n'.format( art_name ) )

從長遠來看,您需要在輸入中解決非ASCII字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM