以前我曾经发贴说,VIM看汉字是乱码,当时我说的是ssh连接乱码,最后是通过更改服务器的language来解决的。
taobaoDBA的陶方则研究的比较深入,他认为:无论字符串采用了什么字符集,在内存和文件中的存储形式都是二进制的。出现乱码的原因是解释并显示二进制数据的字符集和产生二进制数据的字符集不能兼容引起的。
原文如下:
http://rdc.taobao.com/blog/dba/html/275_vim_charset_researc.html
- 字符集转换是个很麻烦的事情,特别是数据库的字符集转换,涉及到了很多细节。
- 为了引出更多的讨论,我这先抛个砖头,是关于vim编码的问题,希望大家看完能有所收获。
- 1、无论字符串采用了什么字符集,在内存和文件中的存储形式都是二进制的。出现乱码的原因是解释并显示二进制数据的字符集和产生二进制数据的字符集不能兼容引起的。
- 2、从一个字符集转换到另外一个字符集是可以做到的,但是必须要有代码去实现这个转换。有些时候是显式转换,有些时候是隐式转换。vim属于显式转换。
- vim有三个编码参数,分别是fileencoding(或fileencodings)、encoding、termencoding,根据字面理解,分别代表了文件的编码格式、缓存的编码格式、终端的编码格式。fileencoding和encoding不一致的时候,缓存中的数据会进行一次字符集转换,然后存入磁盘。当encoding和termencoding不一致的时候,缓存中的数据也会进行一次转换,然后以字节流的形式传给终端。终端(TTY)和伪终端(PTS)都有自己的编码格式。Linux的LANG即是TTY的编码格式,SecureCRT的字符集设置即是PTS的编码格式(无论是ssh和是telnet都一样)。如果不指定fileencoding、encoding、termencoding的编码格式,那么vim将会读取操作系统的字符集设置。实际上,只要正确设置这三个参数和SecureCRT,操作系统的字符集是不会影响远程查看和编辑文件(什么,你用emac?-。 -b)。
- --EOF--
还贴了一张图: