原文链接:http://blog.163.com/mageng11@126/blog/static/1408083742012128105645169/

关于vim乱码,这篇文章讲的很详细,mark一下

基本设置

  1. 显示行号 :set nu
  2. 显示空白字符 :set list

编码(打开gb2312文件)

set encoding=utf-8
" 如果你要打开的文件编码不在此列,那就添加进去
set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
set termencoding=utf-8

[摘引] vim中编辑不同编码的文件时需要注意的一些地方

此文讲解的是vim编辑多字节编码文档(中文)所要了解的一些基础知识,注意其 没有涉及gvim,纯指字符终端下的vim。vim编码方面的基础知识:

1. 存在3个变量:
encoding
该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本 文件等等。你可以把 ‘encoding’ 选项当作是对 Vim 内部运行机制的设定。
fileencoding
该选项是vim写入文件时采用的编码类型。
termencoding
该选项代表输出到客户终端(Term)采用的编码类型。
2.. 此3个变量的默认值:
encoding
与系统当前locale相同,所以编辑文件的时候要考虑当前locale, 否则要设置的东西就比较多了。
fileencoding
vim打开文件时自动辨认其编码,fileencoding就为辨认的值。 为空则保存文件时采用encoding的编码,如果没有修改encoding,那值就是系 统当前locale了。
termencoding
默认空值,也就是输出到终端不进行编码转换。

由此可见,编辑不同编码文件需要注意的地方不仅仅是这3个变量,还有系统当前 locale和、文件本身编码以及自动编码识别、客户运行vim的终端所使用的编码类 型3个关键点,这3个关键点影响着3个变量的设定。

如果有人问:为什么我用vim打开中文文档的时候出现乱码?

答案是不确定的,原因上面已经讲了,不搞清楚这3个关键点和这3个变量的设定 值,出现乱码是正常的,倒是不出现乱码那反倒是凑巧的。

再来看一下常见情况下这三个关键点的值以及在这种情况下这3个变量的值:

  1. locale 目前大部分Linux系统已经将utf-8作为默认locale了,不过也有可能 不是,例如有些系统使用中文locale zh_CN.GB18030。在locale为utf-8的情 况下,启动vim后encoding将会设置为utf-8,这是兼容性最好的方式,因为 内部处理使用utf-8的话,无论外部存储编码为何都可以进行无缺损转换。 locale决定了vim内部处理数据的编码,也就是encoding。
  2. 文件的编码以及自动编码识别—-这方面牵扯到各种编码的规则,就不一一细 讲了。但需要明白的是,文件编码类型并不是保存在文件内的,也就是说没 有任何描述性的字段来记录文档是何种编码类型的。因此我们在编辑文档的 时候,要么必须知道这文档保存时是以什么编码保存的,要么通过另外的一 些手段来断定编码类型,这另外的手段,就是通过某些编码的码表特征来断 定,例如每个字符占用的字节数,每个字符的ascii值是否都大于某个字段来 断定这个文件属于何种编码。这种方式vim也使用了,这就是vim的自动编码 识别机制了。但这种机制由于编码各式各样,不可能每种编码都有显著的特 征来辨别,所以是不可能 100%准确的。对于我们GB2312编码,由于其中文是 使用了2个acsii值高于127的字符组成汉字字符的,因此不可能把gb2312编码 的文件与 latin1编码区分开来,因此自动识别编码的机制对于gb2312是不成 功的,它只会将文件辨识为latin1编码。此问题同样出现在gbk,big5 上等。 因此我们在编辑此类文档时,需要手工设定encoding和fileencoding。如果 文档编码为utf-8时,一般vim都能自动识别正确的编码。
  3. 客户运行vim的终端所使用的编码类型—-同第二条一样,这也是一个比较难以 断定的关键点。第二个关键点决定着从文件读取内容和写入内容到文件时使 用的编码,而此关键点则决定vim输出内容到终端时使用的编码,如果此编码 类型和终端认为它收到的数据的编码类型不同,则又会产生乱码问题。在 linux本地X环境下,一般终端都认为其接收的数据的编码类型和系统locale 类型相符,因此不需关心此方面是否存在问题。但如果牵涉到远程终端,例 如ssh登录服务器,则问题就有可能出现了。例如从1台locale为GB2310的系 统(称作客户机)ssh到locale为utf-8的系统(称作服务器)并开启vim编辑 文档,在不加任何改动的情况下,服务器返回的数据为utf-8的,但客户机认 为服务器返回的数据是gb2312的,按照 gb2312来解释数据,则肯定就是乱码 了,这时就需要设置termencoding为gb2312来解决这个问题。此问题更多出 现在我们的 windows desktop机远程ssh登录服务器的情况下,这里牵扯到不 同系统的编码转换问题。所以又与windows本身以及ssh客户端有很大相关性。 在 windows下存在两种编码类型的软件,一种是本身就为unicode编码方式编 写的软件,一种是ansi软件,也就是程序处理数据直接采用字节流,不关心 编码。前一种程序可以在任何语言的windows上正确显示多国语言,而后一种 则编写在何种语言的系统上则只能在何种语言的系统上显示正确的文字。对 于这两种类型的程序,我们需要区别对待。以ssh客户端为例,我们使用的 putty是unicode软件,而secure CRT则是ansi 软件。对于前者,我们要正确 处理中文,只要保证vim输出到终端的编码为utf-8即可,就是 termencoding=utf-8。但对于后者,一方面我们要确认我们的windows系统默 认代码页为cp936(中文windows默认值),另一方面要确认vim设置的 termencoding= cp936。

最后来看看处理中文文档最典型的几种情况和设置方式:

  1. 系统locale是utf-8(很多linux系统默认的locale形式),编辑的文档是 GB2312或GBK形式的(Windows记事本默认保存形式,大部分编辑器也默认保 存为这个形式,所以最常见),终端类型utf-8(也就是假定客户端是putty 类的unicode软件)则vim打开文档后,encoding=utf-8(locale决定 的),fileencoding=latin1(自动编码判断机制不准导致 的),termencoding=空(默认无需转换term编码),显示文件为乱码。

    • 解决方案1 : 首先要修正fileencoding为cp936或者euc-cn(二者一样的, 只不过叫法不同),注意修正的方法不是:set fileencoding=cp936,这只 是将文件保存为cp936,正确的方法是重新以cp936的编码方式加载文件 为:edit ++enc=cp936,可以简写为:e ++enc=cp936。
    • 解决方案2 : 临时改变vim运行的locale环境,方法是以LANG=zh_CN vim abc.txt的方式来启动vim,则此时encoding=euc-cn(locale决定 的),fileencoding=空(此locale下文件编码自动判别功能不启用,所以 fileencoding为文件本身编码方式不变,也就是 euc-cn),termencoding=空(默认值,为空则等于encoding)此时还是乱 码的,因为我们的ssh终端认为接受的数据为utf-8,但vim发送数据为 euc-cn,所以还是不对。此时再用命令: set termencoding=utf-8将终端 数据输出为utf-8,则显示正常。
  2. 情况与1基本相同,只是使用的ssh软件为secure CRT类ansi类软件。

vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自 动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显 示文件为乱码。

  • 解决方案1 : 首先要保证运行secure CRT的windows机器的默认代码页为 CP936,这一点中文windows已经是默认设置了。其他的与上面方案1相同, 只是要增加一步,:set termencoding=cp936
  • 解决方案2 : 与上面方案2类似,不过最后一步修改termencoding省略即 可,在此情况下需要的修改最少,只要以locale为zh_CN开启vim,则 encoding=euc-cn,fileencoding和termencoding都为空即为encoding的 值,是最理想的一种情况。

可见理解这3个关键点和3个参数的意义,对于编码问题有很大助力,以后就可以 随心所欲的处理文档了,同时不仅仅是应用于vim,在其他需要编码转换的环境 里,都可以应用类似的思路来处理问题解决问题。

最后推荐一款功能强大的windows下的ssh客户端—-xshell,它具有类似secure CRT一样的多tab 的ssh窗口的能力,但最为方便的是这款工具还有改变Term编码 的功能,这样我们就可以不用频繁调整termencoding,只需在ssh软件里切换编码 即可,这是我用过的最为方便的ssh工具。它是商业软件,但非注册用户使用没有 任何限制,只是30天试用期超出后会每次启动都提示注册,对于功能没有丝毫影 响。

VIM 乱码终极解决的更多相关文章

  1. vim乱码的解决

    解决vim文件乱码,打开文件乱码,菜单,提示信息乱码: 有四个跟字符编码方式有关的选项,encoding.fileencoding.fileencodings.termencoding 在linux中 ...

  2. ueditor 1.4.3 gbk asp 上传中文乱码 终极解决方法 ie6 ie8 也适用

    [摘要:百度编纂器1.43 gbk asp 题目 1.firefox3.0下 单图上传 面没有了 面多图上传 中央的蓝色按钮(即 面击挑选图片)没有表现(附件上传出那个题目) 没有晓得我的水狐吃翔了 ...

  3. jsp中文乱码终极解决方法(转)

    一, 找出问题的根源乱码可能出现的地方: jsp页面中 jsp页面之间相互传参的参数 与数据库中数据的存取 基本归纳为以上几种. 二, 寻找解决方案 出现在jsp页面中,是由于没有设置jsp页面的中文 ...

  4. jsp中文乱码终极解决方法

    转载http://blog.csdn.net/csh624366188/article/details/6657350 一 找出问题的根源    乱码可能出现的地方:1 jsp页面中          ...

  5. 在ASP.NET中,IE与Firefox下载文件带汉字名时乱码的解决方法

    解决办法: HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Buffer = true; HttpContext. ...

  6. vim应用:终极解决windows系统gvim/vim的各种乱码(文件,菜单,提示信息)!

    这个方法解决了我的windows下 gvim的中文乱码问题(跟大家分享一下). 此方法引用   http://www.douban.com/note/145491549/ 查看文件的编码::echo ...

  7. url 传递中文参数乱码问题的终极解决方法。

    估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题.当遇到乱码的时候,上网找了很多解决方案,比如: 页面设置它的编码方式,改成utf ...

  8. Ubuntu 16.04系统下解决Vim乱码问题

    方法: 打开终端输入:vim /etc/vim/vimrc,进入编辑模式,加入如下配置: set fileencodings=utf-8,gb2312,gbk,gb18030 set termenco ...

  9. Linux中文乱码问题终极解决方法

    方法一: 修改/root/.bash_profile文件,增加export LANG=zh_CN.GB18030该文件在用户目录下,对于其他用户,也必须相应修改该文件. 使用该方法时putty能显示中 ...

随机推荐

  1. Java之集合(七)Map

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7327216.html 1.前言 按照顺序,本章本是要对Set的相关类进行介绍及讲解的.但是对于其实现有所了解的都 ...

  2. Spring Security构建Rest服务-1204-Spring Security OAuth开发APP认证框架之Token处理

    token处理之一基本参数配置 处理token时间.存储策略,客户端配置等 以前的都是spring security oauth默认的token生成策略,token默认在org.springframe ...

  3. PlanetTogether APS安装与配置

    一.PT 安装 1.PT Server与Client的下载 下载网址:https://download.planettogether.com/ 2.安装.net framework 4.6.2 安装P ...

  4. 深入JVM学习心得

    前言 相信很多人和我一样长期使用java编程,却很少关注过JVM底层实现,这很大程度上是因为JVM设计的很精巧,因此平时项目也很少遇到涉及JVM的问题.但是一方面出于对java底层技术的好奇,另一方面 ...

  5. 这个PHP无解深坑,你能解出来吗?(听说能解出来的都很秀)

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由horstxu发表于云+社区专栏 1. 问题背景 PHP Laravel框架中的db migration是比较常用的一个功能了.在每个 ...

  6. Hive集成HBase实践

    #step1: create hive table 't_test' hive -e "create table test.t_user(id int,name string,age int ...

  7. Node.js之Express三

    端午节3天说没就没了,自己的脚伤都快一个月了还没好,原本想着去桂林或者厦门呢,可计划赶不上变化,看自己公司C#软件工程师的招聘条件有要求MongoDb,年前就打算自己学习下,买的这本书就叫Node.j ...

  8. 以中间件,路由,跨进程事件的姿势使用WebSocket--Node.js篇

    上一篇文章介绍了在浏览器端以中间件,路由,跨进程事件的姿势使用原生WebSocket.这篇文章将介绍如何使用Node.js以相同的编程模式来实现WebSocket服务端. Node.js中比较流行的两 ...

  9. C学习笔记(2)--指针

    一.多文件结构总结 1.子源文件里面包含自己对应的头文件 2.无论是何源文件调用库函数,都需要包含该库函数的声明所在的头文件 3.头文件又叫接口文件,.c对数据和函数进行封装和包含, .h就是.c对外 ...

  10. include,forward和param指令