2016-09-18 1 views
0

Donc j'essaye de programmer un bot IRC Twitch.tv simple. Le bot lit les messages entrants dans le canal, et si les messages correspondent à certains modèles, le bot effectue certaines tâches. Le problème que j'obtiens est que si un utilisateur entre certains caractères unicode (ie si l'utilisateur entre "¯_ (ツ) _/¯", le programme lancera l'erreur et le crash:UnicodeEncodeError avec Twitch.tv Bot IRC

UnicodeEncodeError n'a pas été manipulé par code utilisateur

codec « charmap » ne peut encoder le caractère « \ XAF » en position 13: caractère cartes à < non défini>

maintenant, je veux que mon programme soit capable de gérer ces entrées, mais je aucune idée de ce qu'il faut changer ou ajouter à mon code pour activer ceci.Ceci est mon code:

http://pastebin.com/EBTaqpbZ (Je ne pouvais pas figurer e comment utiliser la pâte de code Stackoverflow)

La partie principale du code que je reçois l'erreur est:

while True:              #Main Loop 
    response = s.recv(1024).decode("utf-8") 
    if response == "PING :tmi.twitch.tv\r\n":     #If Ping, return Pong 
     s.send("PONG :tmi.twitch.tv\r\n".encode("utf-8")) 
     print("Pong Successful") 
    else:              #Else, Decode User Message 
     username = re.search(r"\w+", response).group(0)   #Gets User 
     message = CHAT_MSG.sub("", response)     #Gets Message 
     print (username + ": " + message)      #Prints User Message 
     if message.find("!hello") != -1:      #Simple Test command to see if Reading Chat Input 
      chat ("Hello! I'm speaking!\r\n") 
    time.sleep(1/cfg.RATE) 

L'erreur semble toujours se passer sur la ligne de code: print (username + ": " + message)

Est-ce que quelqu'un sait comment je dois gérer ces caractères Unicode?

Répondre

1

(commentaient avec un lien vers une réponse mais je n'ai pas assez réputation encore.)

Donc, je suppose que vous utilisez Windows? Ce qui se passe, c'est que l'encodage utilisé par votre console ne peut pas imprimer les caractères Unicode, ce qui provoque le plantage.

Donc, le problème n'est pas tellement dans le code lui-même, seulement les outils utilisés. Par exemple, le code s'exécute correctement lorsqu'il est exécuté à partir d'une console Linux. Une façon de surmonter ce problème semble utiliser win-unicode-console pour activer l'entrée et la sortie Unicode à partir de la console Windows. Voir this answer pour une description plus large du problème et de la solution.

Vous pouvez aussi aller contourner le problème si vous avez juste besoin de l'impression à des fins de débogage:

msg = username + ": " + message 
print (msg.encode("utf-8")) 

Cependant, ce n'est pas une solution réelle, et la sortie sera quelque chose comme

b '\ xc2 \ XAF _ (\ xe3 \ x83 \ x84) _/\ xc2 \ XAF \ r \ n'

pour votre chaîne exemple, donc pas très pratique. Je recommande de lire la réponse que j'ai liée.