Today I’m a little short in time, so I decided to implement one of the bit-sized tasks in my backlog. These UTF8 raw strings appearing in my xchat when someone else is using that encoding is bothering for a long time, and the fix is now straightforward, with the latest update I’ve done in the xchat python plugin (the emit_print() API function was implemented). It’s just a matter of creating a decode() function which tries to decode the string from UTF8, and reencode it as ISO-8859-1. If it succeeds, it blocks xchat, and sends the message by itself. Otherwise it just lets xchat do its work. After that, I’ve hooked this method in the many print events, including information about which of the parameters are the strings to decode. Here is an excerpt (the full version is in the examples section of the xchat-python page):
... def decode(word, word_eol, userdata): event, pos = userdata if type(pos) is int: pos = (pos,) changed = False for i in pos: try: reencoded = word[i].decode('utf8') .encode('iso-8859-1') except UnicodeError: continue if reencoded != word[i]: word[i] = reencoded changed = True if changed: xchat.emit_print(event, *word) return xchat.EAT_XCHAT else: return xchat.EAT_NONE EVENTS = [ ("Channel Action", 1), ("Channel Action Hilight", 1), ... ] for event in EVENTS: xchat.hook_print(event[0], decode, event) ...
Notice that you need the latest version of the xchat-python plugin, which will be available in the next version of xchat (coming after 2.0.5). You may also download xchat 2.0.5, and update the plugin with the file available in the Download section of the plugin page.