搞定utf8环境里screen caption的中文显示问题[zt]

搞定utf8环境里screen caption的中文显示问题 转自 http://zhllg.spaces.live.com/blog/cns!956A48A2D7ED7265!1678.entry?wa=wsignin1.0

相关连接:
http://zhllg.spaces.live.com/blog/cns!956A48A2D7ED7265!1567.entry

记一下自己的思路和进展,good luck to me!
工具有vim, cscope, ctags, gdb
http://zhangle.is-a-geek.org/view_source_using_vim.html

首先,找找代码里处理配置文件的部分,然后看处理caption的部分。在vi里执行:cs find e caption,找到很多结果找到一个变量,captionstring,再执行:cs find s captionstring
找到一个 buf = MakeWinMsgEv(captionstring, p, '%', D_width - !D_CLP, &cv->c_captev, 0);
应该是MakeWinMsgEv把captionstring转换成具体要显示的字符串,甚至显示在屏幕上,看看这个函数的实现。这个函数看着颇为不爽,windows函数的命名风格。
发现显示用的应该是另一个函数 PutWinMsg()
发觉应该找找screen debug的方法,有没有什么类似内核printk之类的东西。
还是用gdb吧,按照gentoo bug reporting guide里的方法重新安装screen。
emerge screen时发现失败,然后发现用的ebuild是我本地的overlay里的。我已经不记得当时为什么把screen放到overlay里。还发现了一个configure选项--enable-locale,作用是
--enable-locale use localized month/day names
而新的ebuild已经没有这个了,怪不到好像没有其他人遇到。
还是决定继续搞搞,为什么就不能用中文?感觉应该不是很难处理。
emerging screen。抽空翻译会gentoo mips文档。
编 译完毕,另起一个xterm,export LC_ALL=zh_CN.UTF-8, screen,pstree看到有两个screen,找到子进程screen的pid。在原终端里sudo su -,接着gdb --pid=12474 /usr/bin/screen
先在 buf = MakeWinMsgEv(captionstring, p, '%', D_width - !D_CLP, &cv->c_captev, 0);
处设置一个断点
(gdb) b display.c:2623
然后让screen继续运行
(gdb) c
然后在screen里改变caption
进入命令行模式,在:提示符处输入caption always %D,这个是把caption设定为星期几,对于中文locale就只有一个数字。比如星期五,就应该是五。
回车后然后发现screen停住了,yes!断点起效!
(gdb) s
(gdb) fin
发现MakeWinMsgEv的返回值在gdb虽然显示乱码,但是这个值确确实实是“五”的UTF-8编码。
看来是显示的问题。
啊,加了debug USE标记的screen会在/tmp/debug目录里记录debug log,不错。而且发现PutWinMsg的参数确实是正确的。
那肯定是最后打印的时候,把字符串当成了ascii,而没有当成UTF8。
确实打印的时候是一个字节一个字节打印的,一个UTF-8中文字符可是有3个字符。
不过后面似乎有把连续多个字节合并的函数……
(这里的想法不太对,字符串就应该是一个字节一个字节打印的,只要不改变它,不改变顺序就可以。这里恰恰是因为字符本身被改变了,一个变成了两个,才导致乱码)

发现一点,如果使用gbk字符集,caption里可以显示中文
跟踪了一下,也没发现这些中文字符经过了什么特别的处理
也是一个一个字符的AddChar的,AddChar里这个字符最后被放到D_obuf里

终于找到了根源
原来是AddUtf8()这个函数
其实本来stftime得来的已经是utf8编码的本地化的星期或月份字符串,直接打印就可以了。
可是在RAW_PUTCHAR()里又把这个已经可以直接打印的字符串又处理了一遍,不知道到底是想干什么。

OK了,一个相当dirty的hack,就是把RAW_PUTCHAR()里的那个AddUtf8()改成AddChar()
不知道这样做对其他地方有没有什么影响,恐怕会有。
总体来说,screen对于其他语言的支持,从根本上来说是个hack,不是那么完美。尤其是localized weekday/month names这一块。

发了email去screen-devel ml报告了这个问题。不知道最后结果能怎样。

你可能感兴趣的:(#gentoo)