2005年12月17日星期六

VIM全角标点的宽度问题

当使用GVIM且set encoding=utf8时,某些中文字符(如双引号)的宽度不正常——明明是全角字符,但却按照半角字符的宽度来显示。

这个问题困扰了我蛮久,在网上也搜不到解决办法。后来逼不得已,钻进VIM的源码里逛了一圈,才找到了答案。有兴趣知道细节的请去看mbyte.c中的utf_char2cells函数,这里只说结果。

原来在Unicode中,有一部分字符是“不定宽度”的。如全角的引号、破折号,在中文系统中应该占两个字符的位置,而在西欧语系的系统中则只占一个字符的位置。至于那些个白人明明已经有ASCII范围内的引号和减号用了,为什么还来掺和全角标点,我就不知道了。

GVIM中,对于“不定宽度”的字符,默认情况下是按照半角显示,这就是问题的由来。只要set ambiwidth=double,就可以使这些这些字符正常显示了。