Vim编码知识,乱码问题
原文:http://demi-panda.com/2012/12/26/vim-encoding/
在vim的初始学习阶段,乱码经常是困扰新手的一个比较烦躁的问题,本文试图阐述Vim的编码知识,及设置,针对乱码的原因和解决方案。
文本编码
常见的文本编码包括:ASCII、GBK、GB2312、GB18030、UTF8、UTF16等,各种编码的来源与详细知识请参考以下的这篇文档:http://hi.baidu.com/sinper9527/blog/item/4b6a58020b06c481d43f7c81.html
Vim编码选项
Encoding- 简写Enc
encoding 是 Vim 内部使用的字符编码方式。当我们设置了 encoding 之后,Vim 内部所有的 buffer、寄存器、脚本中的字符串等,全都使用这个编码。
由于 encoding 选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改 encoding 会造成非常多的问题。Linux操作系统默认编码都是UTF-8,如果没有特殊情况,最好设置encoding为UTF-8。为了避免在非 UTF-8 的系统如 Windows 下,菜单和系统提示出现乱码,可同时做这几项设置:
$ vim ~/.vimrc #添加如下设置 set encoding=utf-8 set langmenu=zh_CN.UTF-8 language message zh_CN.UTF-8
termencoding
故明思意termencoding 是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding 没有设置,则直接使用 encoding 不进行转换。
fileencoding
当 Vim 从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同,Vim 就会对编码进行转换。转换完毕后,Vim 会将 fileencoding 选项设置为文件的编码。当 Vim 存盘的时候,如果 encoding 和 fileencoding 不一样,Vim 就会进行编码转换。因此,通过打开文件后设置 fileencoding,我们可以将文件由一种编码转换为另一种编码。
fileencodings
编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM 按顺序使用 fileencodings 中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding 设置为这个值,如果失败的话,就继续试验下一个编码。
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
注意
latin1 是一种非常宽松的编码方式,如果你把 latin1 放到了 fileencodings 的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。
Vim编码转换流程图
借用网友的一张流程图
乱码的原因分析
1、操作系统的语言环境, 使用 locale 查看
2、Vim的enc 设置,enc是用于VIM做内部表示的,也就是说VIM内部处理的是以enc编码的文本流,所以实际上enc的值和显示是否乱码没有根本上的必要联系。只不过enc的值通常是tenc的取值来源而已,所以这里暂且将它列举为可能引起乱码的一个因素。
3、Vim的tenc 设置
解决方案
1、从上面的原因来分析,tenc是用于告诉VIM终端的locale值是什么的,那么,如果tenc告诉VIM的值是错误的话,那就肯定乱码。所以乱码的最根本原因就是tenc的值和locale的值不同而造成的。
(1) 在Native Linux/Unix环境下,locale的值与tenc的值不同
(2) 在Windows环境下,终端软件设置的Encoding(可以认为是locale)的值与tenc的值不同
2、遵循简单而统一的原则
(1) 中文环境GBK码
将你的locale设置为zh_CN.gbk,然后将VIM设置如下:
set enc=gbk set fencs=gbk,gb2312,gb18030,cp936,utf8
(2) 中文环境utf8码
将你的locale设置为zh_CN.utf8,然后将VIM设置如下:
set enc=utf8 set fencs=utf8,gbk,gb2312,gb18030,cp936
(3) 英文环境ASCII码 最简单的就这个了,啥都不用设置了,建议还是用英文环境最好...
3、可以设置系统变量
$ vi ~/.bash_profile 或者 vi /etc/profile #添加如下代码 export LANG="zh_CN.UTF-8" 或者"en_US.UTF-8" export LC_ALL="zh_CN.UTF-8" 或者"en_US.UTF-8"
阅读(238) | 评论(0) | 转发(0) |
-->
Vim编码知识,乱码问题的更多相关文章
- 解决了一个困扰我近一年的vim显示中文乱码的问题
今天解决了vi命令打开日志文件中文总是显示乱码的问题.由于项目组中的日志包含一些特殊字符,所以使用vim打开日志文件时总是不能正确识别出文件字符编码.此时用:set fileencoding命令可以看 ...
- iconv内容,convmv文件名,unix2dos,dos2unix文件格式转换,od/cut/wc/dd/diff/uniq/nice/du等命令,linux文件名乱码,文件名,文件内容,vim编码设置
1.enconv文件名编码转换,比如要将一个GBK编码的文件转换成UTF-8编码,操作如下 enconv -L zh_CN -x UTF-8 filename enconv -L GB2312 -x ...
- Linux vim 中文显示乱码解决方法
因为在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码.改动了一下配置文件,使vi支持gb编码就好了.$vi ~/.vimrclet &a ...
- linux下编码和vim编码问题解决
Linux下编码问题 在Linux环境下经常会出现文件乱码的问题,这实际上就是因为文件编码,以Ubuntu为例,默认的字符编码为UTF-8,并且没有默认安装gbk和gb2312,所以需要我们进行安装和 ...
- 字符编码知识简介和iconv函数的简单使用
字符编码知识简介和iconv函数的简单使用 字符编码知识简介 我们知道,在计算机的世界其实只有0和1.期初计算机主要用于科学计算,而我们知道一个数,除了用我们常用对10进制表示,也可以用2进制表示,所 ...
- id,is的用法,小数据池的概念及编码知识进阶
一:id 查询内存地址 name = 'alex' print(id(name)) li = [1,2,3] print(id(li)) 二:is 判断的是内存地址 name1 = 'alex@' ...
- vim应用:终极解决windows系统gvim/vim的各种乱码(文件,菜单,提示信息)!
这个方法解决了我的windows下 gvim的中文乱码问题(跟大家分享一下). 此方法引用 http://www.douban.com/note/145491549/ 查看文件的编码::echo ...
- vim 编码方式的设置
和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2.UTF-8 等流行的 Unicode 编码方式.然而不幸的是,和很多来自 Linux 世界的软件一样,这需要 ...
- vim编码相关
与vim编码相关的四个配置: encoding:vim核心编码,所有vim交换区,信息提示区都用这个编码.打开文件的编码如果是其他编码,会自动转换为核心编码,保存时再转回文件编码. fileencod ...
随机推荐
- linux下创建与删除用户详细步骤 ***
linux下用户的操作还是相对容易理解的,基本操作如下: 1.新增用户 只有root用户能创建新用户 #useradd user1 新建后将会在/home目录下生成一个与用户名相同的用户主目录.同时会 ...
- (转)使用PowerDesigner生成HTML功能
本文转载自:http://www.cnblogs.com/CowboyProgrammer/archive/2009/04/28/1445423.html 使用PowerDesigner设计数据库关系 ...
- java求10!的阶乘
package com.aaa; //求10!的阶乘 public class Cheng { public static void main(String[] args) { int s=1; fo ...
- mysql函数之一:INSTR、LOCATE、POSITION VS LIKE
LOCATE.POSITION和INSTR函数相似功能实例 使用LOCATE.POSITION和INSTR函数查找字符串中指定子字符串的开始位置.SQL语句如下: mysql>SELECT LO ...
- Java-API-Package:java.sql百科
ylbtech-Java-API-Package:java.sql百科 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API.此 API 包括一个框架,凭借 ...
- js前端处理datetime时间类型
MySql数据库日期字段定义的是datetime类型,(顺带插入MySql数据库datetime类型可以用这个: str_to_date('2008-4-2 15:23:28','%Y-%m-%d % ...
- Linux学习笔记 -- 为 Shell 传递参数
我们可以在执行 Shell 脚本时,可以向脚本传递参数.脚本内获取参数的格式为:$n.(n 代表一个数字,0为所执行的shell脚本名称,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类 ...
- 关于 NULL的坑
有如下的表: select * from testtable where name in ('name'): 结果是第一条: select * from testtable where name n ...
- python学习(十) 自带电池
10.1 模块 >>> import math >>> math.sin(0) 0.0 10.1.1 模块是程序 假设自己写的hello.py放在c:\python ...
- python's twenty-seventh day for me 模
time模块: 1,计算执行代码的时间 time.time() 2,让程序停这里一段时间 time.sleep(时间(s)) 时间戳时间: import time print(time.time()) ...