方法:

由于在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码。修改了一下配置文件,使vi支持gb编码就好了。

$vi~/.vimrc

let&termencoding=&encodingsetfileencodings=utf-8,gbk

$:wq

再次打开vi,显示就正常了。

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,在其他需要编码转换的环境里,都可以应用类似的思路来处理问题解决问题。

linux 编辑文件乱码,Linux中vi编辑器显示中文乱码的问题相关推荐

  1. linux atom编码设置,Ubuntu中Atom编辑器显示中文乱码的处理方法

    在Ubuntu14.04 64位机上安装Atom,依次在终端输入如下命令: 1.$ sudo add-apt-repository ppa:webupd8team/atom 2.$ sudo apt- ...

  2. Ubuntu中Atom编辑器显示中文乱码的处理方法

    在Ubuntu14.04 64位机上安装Atom,依次在终端输入如下命令: 1. $ sudo add-apt-repository ppa:webupd8team/atom 2. $ sudo ap ...

  3. linux编辑文件命令 vi_Linux的vi编辑器

    基本上vi可以分为三种状态,分别是命令模式.插入模式和底行模式. 1.命令模式 用户刚刚启动 vi/vim,便进入了命令模式.此状态下敲击键盘动作会被Vim识别为命令,而非输入字符.比如我们此时按下i ...

  4. Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法

    Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法 Eclipse 工具中的操作 流程图片生成的两种方式: 使用 activiti-designer 设计流程图 ...

  5. linux命令框显示中文乱码_CentOS终端命令行显示中文乱码的解决方法

    这篇文章主要介绍了CentOS终端命令行显示中文乱码的解决方法,以及测试方法和缺少中文字体时的解决方法,需要的朋友可以参考下 安装CentOS的时候选择了中文,结果在终端不能显示中文,都是乱码,解决方 ...

  6. mac matlab 中文乱码,MAC让Matlab编辑器显示中文的方法

    一些使用英文版MAC系统的用户发现自己安装了matlab之后,无法让它显示中文.这个问题该怎么解决呢?今天小编就为大家解决这个烦恼.下面一起来看看具体的操作步骤吧. 具体操作步骤: 1. 打开matl ...

  7. android zip中文乱码,Android中解压zip中文乱码处理

    乱码原因分析 一般我们使用的Windows系统外部文件默认都是GBK编码方式,Mac系统默认的好像是UTF-8(同事的电脑就是,不知道其他人的是不是),Linux的没验证过,这里我讨论的是Window ...

  8. linux 编辑文件软件,Linux文本处理工具及Vim编辑器

    查看文本工具 查看文件 cat cat [OPTION]... [FILE]... -n:显示行号 -A:显示所有控制符 -E:显示行结束符$ -b:显示非空行行号 -s:压缩连续的空行成一行 tac ...

  9. linux 编辑文件vim,linux下通过vim编辑文件的方法

    安卓问题集-Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 错误出现原因: 1.没有 AndroidManifest.xml f ...

最新文章

  1. 导出SAP表结构到EXCEl
  2. 50个Android应用!Win11支持运行了
  3. P5825-排列计数【EGF,NTT】
  4. python 读取excel表格_python 对Excel表格的读取
  5. linux下sendmail邮件系统安装操作记录
  6. 从我想,到我做 | 掘金年度征文
  7. WIN7下访问ftp的方法
  8. matlab给图像加云,matlab怎么给图像加雾
  9. mac安装JDK及maven
  10. 最经典的PS入门笔记,来自李涛老师的高手之路
  11. PDF顽固水印去除(Foxit PDF Editor)
  12. 双击计算机在任务栏里打不开了,电脑任务栏点击没反应卡死解决方法
  13. Pr:基本图形(文本)
  14. 哈工大人工智能研究院院长刘劼:打造从科研到产业的创新生态
  15. 阿里云OSS 图片处理
  16. C语言:判断质数合数的代码
  17. Https的握手过程
  18. 大数据时代,给我们带来了哪些改变
  19. java实现一元多项式减法_一元多项式 加法 减法 乘法
  20. Thread.currentThread().interrupt()和Thread.interrupted()和Thread.currentThread().isInterrupted()

热门文章

  1. wireshark怎么抓包、wireshark抓包详细图文教程
  2. 第三届“传智杯”全国大学生IT技能大赛(初赛)-Java B组题解
  3. 仁义礼智信,忠孝廉耻勇
  4. python基础day-15:time、hash、json
  5. 数据结构的一些基本术语概念-严蔚敏老师
  6. 完美世界手游服务器显示不了,完美世界手游登陆不了怎么办 完美世界手游无法登陆解决方案...
  7. android手机分辨率适配,Android屏幕适配(一)
  8. PPT扁平化设计总结
  9. Java8中字符串连接(join)收集器 Collectors.joining
  10. 软件质量与测试--第六周作业 软件测试与评估