![](/img/trans.png)
[英]How should I get my Tkinter IRC client to continuously read data from the IRC server?
[英]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個技巧是:
您必須對發布到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.