vim/gvim防止中文乱码。

2023-11-01 05:18
文章标签 vim 中文 乱码 防止 gvim

本文主要是介绍vim/gvim防止中文乱码。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果你用 Vim 编辑中文,而中文不能正确显示,那有两种可能性:一是使用的 Vim 不完整,不含多字节语言支持(multi_byte 特性);二是某个配置出了问题。

多语言支持,最基本的概念有两个:一是文件的语言编码,二是环境的内部编码。在较老的操作系统中,不管 Linux 还是 Windows,这两个编码都是一样的,也就意味着,一次只能处理一种编码的文件:要么只能处理西文编码(Latin1,即 ISO-8859-1),要么只能处理中文编码(GB2312)。而在新的操作系统中,这两者可以是不一样的。在 Linux 上,常见的情况是环境的内部编码使用 UTF-8 ,而 UTF-8 可以同任何一种语言编码作无损转换,这就保证了系统的多语言处理能力。Vim 这方面秉承了 Unix/Linux 的传统,在内部编码使 UTF-8 的时候,可以同时处理不同语言编码的文件。

以下列出了和语言编码的相关的设置:

  • 环境变量 LANG(使用的语言); 环境变量 LC_CTYPE(使用的内部编码);
  • Vim 选项 encoding(Vim的内部编码);
  • Vim 选项 termencoding(Vim 在与屏幕/键盘交互时使用的编码);
  • Vim 选项 fileencoding(Vim 当前编辑的文件在存储时的编码);
  • Vim 选项 fileencodingsVim打开文件时的尝试使用的编码);
  • Vim 选项 ambiwidth(对“不明宽度”字符的处理方式,Vim 6.1.455 后引入)。

如果你的环境只需要处理简体中文的话,那么,最简单的方式就是所有的设定全部使用简体中文。只需要: 设定 LANG=zh_CN.GB2312,不设定 LC_CTYPE(默认跟 LANG 一样),不设定与编码相关的 Vim 选项(默认由 LANG 和 LC_CTYPE 决定),也无需设定 Vim 选项 ambiwidth。 也就是说,我们把语言设定为中国(CN)使用的中文(zh),编码为 GB2312(注意:Vim 内部并不识别国标 GB18030,所以此处只能设 GB2312;参看下面关于 UTF-8 的讨论)。

不过,如果按照目前 Linux 下的惯例,内部编码一律使用 UTF-8 的话,会有一些额外的好处,其中之一就是在这种情况下 Vim 支持同时编辑多种不同编码的文件,如简体中文和繁体中文(参见图 2);另外,此时 Vim 也可以通过编码转换支持 GBK 和 GB18030了。这样,众多关于语言编码的 Vim 选项就有了用武之地了。

  • encoding=utf-8:不管文件的编码如何,不管如何显示和输入,Vim 内部使用的编码是 UTF-8;这是国际化支持的基础。
  • termencoding:取决于实际的终端或 X Window 的设定。举例来说,如果选择语言简体中文登录到 X Window,或者正在使用 CXTERM 的话,那么该选项应被设为 GB2312;如果使用缺省的语言(LANG=en_US.UTF-8)登录到 X Window,或者使用 PuTTY 远程访问 Linux 机器、并且设定里的字符编码(配置中 Window-Translation)设为 UTF-8 的话,该选项就应该设为 utf-8。从 Windows 下使用 PuTTY 远程连接 Linux 的请特别注意,测试表明,仅在使用 UTF-8 的情况下,PuTTY 才能可靠地支持中文的显示和输入(显示字体必须设成中文字体)。
  • fileencoding:文件载入时,该选项被置为 Vim 认定的文件编码,因此, 存储时文件的编码不会改变。此处和下面 fileencodings 可使用的编码为 libiconv 支持的所有几百种编码(如果编译时包含了 iconv 特性的话),与中文相关的有 gb2312、gbk、gb18030、hz-gb-2312、iso-2022-cn、big5、cp936、cp950 等。如果创建新文件,你又不希望使用 UTF-8 作为文件编码时,那么,你可能需要手工设定该选项,如“:set fileencoding=gb2312”。需要注意的一点是,使用“set”来设定该选项的话会改变以后新建文件的缺省编码,而使用“setlocal”的话则只影响当前文件(参考“:help setlocal”)。
  • fileencodings=ucs-bom,utf-8,chinese:Vim 会首先判断文件的开头是否是一个 Unicode 的 BOM(byte order mark)字符,是的话则把文件的其余内容解释成相应的 Unicode 序列;否的话再试图把文件内容解释成 UTF-8 的序列;再失败的话,则把文件解释为简体中文(chinese 是一个跨平台的简体中文字符集的别名,Linux 下相当于 gb2312 和 euc-cn;此处也可以根据需要以 gb2312、gbk 或 gb18030 等编码替代)。需要注意的是,该顺序不能颠倒,并且在后面再添加其它编码如 big5、latin1 也是没有意义的,因为 Vim 不能识别 8 比特编码中的错误,因此这些编码后列的编码永远不会被用到。
  • ambiwidth=double:把所有的“不明宽度”字符——指的是在 Unicode 字符集中某些同时在东西方语言中使用的字符,如省略号、破折号、书名号和全角引号,在西方文字中通常字符宽度等同于普通 ASCII 字符,而在东方文字中通常字符宽度等同于两倍的普通 ASCII 字符,因而其宽度**“不明”——的宽度置为双倍字符宽度**(中文字符宽度)。此数值只在 encoding 设为 utf-8 或某一 Unicode 编码时才有效。需要额外注意的是,如果你通过终端使用 Vim 的话,需要令终端也将这些字符显示为双宽度。比如,XTERM 的情况下应该使用选项“-cjk”,即使用命令“uxterm -cjk”来启动使用双宽度显示这些字符的 Unicode X 终端;使用 PuTTY 远程连接的话则应在配置的 Window-Translation 中选中“Treat CJK ambiguous characters as wide”。

参考资料:Vim 实用技术,第 1 部分

这篇关于vim/gvim防止中文乱码。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320736

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

centos 6安装 vim

centos 安装vim 1.首先查询当前当前vim所依赖的包存在不存在.检查缺少哪个几个依赖包 [root@bogon firstCopy]# rpm -qa|grep vivimvim-common-7.4.160-5.el7.x86_64vim-enhanced-7.4.160-5.el7.x86_64vim-filesystem-7.4.160-5.el7.x86_64vim-

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

PHP防止SQL注入详解及防范

SQL 注入是PHP应用中最常见的漏洞之一。事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞。 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。 对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的

PHP防止SQL注入的方法(2)

如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: $unsafe_variable = $_POST['user_input'];mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE”); DROP TA

PHP防止SQL注入的方法(1)

(1)mysql_real_escape_string – 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count(*) as ctr from users where username ='".mysql_real_escape_string($username)."' and password='". mysql_r

防止缓存击穿、缓存穿透和缓存雪崩

使用Redis缓存防止缓存击穿、缓存穿透和缓存雪崩 在高并发系统中,缓存击穿、缓存穿透和缓存雪崩是三种常见的缓存问题。本文将介绍如何使用Redis、分布式锁和布隆过滤器有效解决这些问题,并且会通过Java代码详细说明实现的思路和原因。 1. 背景 缓存穿透:指的是大量请求缓存中不存在且数据库中也不存在的数据,导致大量请求直接打到数据库上,形成数据库压力。 缓存击穿:指的是某个热点数据在

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan