|
gaim0.62登录公社的irc站,设置编码为GBK,登录后发现中文昵称好友不能列出,中文主题显示空白,中文昵称朋友说话时,前面的中文昵称看不见,用/nick命令重命名时,名字乱码,/list命令列出来的频道列表空白,/kick 中文昵称朋友T不了.
查看"gaim源码目录/src/protocols/irc.c"文件,发现作者在信息编码转换时考虑欠完全
(以公社irc为例,公社irc使用GBK编码处理和发送消息)
gtk2库内部使用utf8编码,在gtk2控件上显示的信息需要为utf8编码,对于普通的ascii编码,不需转换成utf8都能正常显示,但对于中文信息,必需转换成utf8编码,才能显示
作者在处理收到和发送的信息时,将信息拆分成几部分,包括who(昵称)和msg(谈话内容)等,使用了irc_send_convert和irc_recv_convert这两个函数来转换编码,将收到或发出的聊天消息(msg)转成用户指定的编码(譬如GBK)发送给服务器(服务器需要)或在当前窗口显示,但是,这两个函数只负责转换谈话的内容,而没有转换昵称(who),结果中文昵称从服务器得到后为GBK编码,程序没有做任何处理就添加到好友列表,结果由于是非utf8编码,显示成空白;同样的原因,/list得到的频道列表信息里有中文,GBK编码,没做任何处理列出得到空白;其他的不良现象原因都是一样
解决方法:在发送时将发送的utf8完整信息(包括who和msg等)完全转成gbk以便服务器处理,在接收信息时将得到完整的信息(包括who和msg等)转成utf8以便在各种控件上显示
修改irc_write函数,这个函数负责将完整的信息发送给服务器,修改这里,加入完全的编码转换;而irc_send_convert已经无用,因为所有的调用irc_send_convert函数其实都是先处理msg,然后加上who这些信息,最后调用irc_write发给服务器,既然irc_write已经修改,那irc_send_convert就无用(conv = g_iconv_open("UTF-8", "UTF-8");这句作用是从UTF8转成UTF8,相当于没作用)
irc_callback这个函数负责读取信息缓冲区(从服务器得到的)里的信息,然后提给irc_parse函数将信息拆分成几部分(who,msg),并分别处理(who没有进行编码转换);修改这个函数,让d=irc_recv_convert(data, d),将d这整条信息都转换成utf8编码,然后再提交给irc_parse处理
具体的修改还有其他地方的一些小修改,都是关于编码转换的,一一修改后,终于可以让gaim0.62的irc可以像以前的老版本一样工作了
感谢公社irc上dalin,x11,alces,樱家冢,itoy...等(排名不分先后 )一贯朋友一直对测试和调试工作给予配合和支持!
附上修改后的irc.c文件和贴图 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|