<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>威言大义 &#187; 中文乱码</title>
	<atom:link href="http://www.chenweionline.cn/archives/tag/%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/feed" rel="self" type="application/rss+xml" />
	<link>http://www.chenweionline.cn</link>
	<description>言简意赅，论人论事论学问</description>
	<lastBuildDate>Thu, 05 May 2011 05:16:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Putty登录后Vim中文乱码问题</title>
		<link>http://www.chenweionline.cn/archives/4.htm</link>
		<comments>http://www.chenweionline.cn/archives/4.htm#comments</comments>
		<pubDate>Mon, 09 Nov 2009 13:40:42 +0000</pubDate>
		<dc:creator>陈威</dc:creator>
				<category><![CDATA[Unix/Linux系统]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[中文乱码]]></category>

		<guid isPermaLink="false">http://www.chenweionline.cn/?p=23</guid>
		<description><![CDATA[

热度:

在用Telnet或Putty登录到远程Unix服务器后，vim是用户最常用的文档编辑工具之一。但在使用Telnet或Putty等字符界面工具远程登录服务器时，vim打开包含有中文内容的文件时经常会遇到中文乱码问题，这可能是由于Unix的默认编码方式、vim的默认编码方式以及终端所在操作系统的编码方式不一致导致的。
在安装WordPress的时候，我用vim打开wp-config-sample.php文件时发现里面的中文都变成了乱码，检查发现服务器上的vim全局配置中把默认编码设为了GB2312，而wp-config=sample.php文件的编码方式却是UTF-8。出于安全考虑，不可能通过修改vim的全局配置来解决这个中文乱码问题。不过Unix在每个用户的主目录中都有生成一个.vimrc的vim局部配置文件（如果没有该文件，用户可以自己建立此文件，只需保证其中的内容符合语法规定即可），这个配置文件规定了以此用户名登录的终端在调用vim命令时的默认配置。为了解决打开wp-config-sample.php时的乱码问题，我在.vimrc文件中添加了如下两行内容：
 注意到上图中，修改了设置包括了termencoding, encoding和fileencodings三个选项，实现的功能是把用于终端的编码方式termencoding设为和vim的默认编码方式一致，并且设文件编码方式为utf-8, gb2312, gbk, ucs-bom和cp936（注意，这几个编码是有优先级关系的）.
.vimrc配置文件中和编码相关的参数主要包括以下四个：

encoding

encoding参数设置的vim的内部编码方式，当我们设置了 &#8221;encoding&#8221; 之后，Vim 内部所有的 buffer、寄存器、脚本中的字符串等都将都使用这个编码方式。Vim 在工作的时候，如果编码方式与它的内部编码不一致，它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符，在这些字符就会丢失。因此，在选择 Vim 的内部编码的时候，
一定要使用一种表现能力足够强的编码。由于 &#8221;encoding&#8221; 选项涉及到 Vim 中所有字符的内部表示，因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改 &#8221;encoding&#8221; 会造成非常多的问题。如果没有特别的理由，请始终将 &#8221;encoding&#8221; 设置为 &#8221;utf-8&#8221;。

termencoding

termencoding 是 Vim 用于屏幕显示的编码，在显示的时候，Vim 会把内部编码转换为屏幕编码，再用于输出。内部编码中含有无法转换为屏幕编码的字符时，该字符会变成问号，但不会影响对它的编辑操作。如果 &#8221;termencoding&#8221; 没有设置，
则直接使用 &#8221;encoding&#8221; 不进行转换。

fileencoding

fileencoding参数规定了vim默认的文件编码方式。当 Vim 从磁盘上读取文件的时候，会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同，Vim 就会对编码进行转换。转换完毕后，Vim 会将 &#8221;fileencoding&#8221; 选项设置为文件的编码。当 Vim 存盘的时候，如果 &#8221;encoding&#8221; 和 &#8221;fileencoding&#8221; 不一样，Vim 也会将文件转换成fileencoding定义的编码方式保存。通过打开文件后设置 &#8221;fileencoding&#8221;，我们可以实现文件的编码转换。但是，由于&#8221;fileencoding&#8221; 是在打开文件的时候，由 Vim 进行探测后自动设置的。所以如果出现乱码，我们无法通过在打开文件后重新设置 &#8221;fileencoding&#8221; 来纠正乱码。

fileencodings

fileencodings参数中可以设置多个编码方式以实现对文件编码的自动识别，因此它是fileencoding的复数形式。该参数的值是一个用逗号分隔的列表，列表中的每一项是一种编码的名称。当我们打开文件的时候，VIM [...]]]></description>
			<content:encoded><![CDATA[
<table>
<tr cellpadding=0><td>热度:</td><td cellpadding=0><img src='http://www.chenweionline.cn/wp-content/plugins/statpresscn/images/sun.gif' width=10 height=10 border=0 /></td><td cellpadding=0><img src='http://www.chenweionline.cn/wp-content/plugins/statpresscn/images/sun.gif' width=10 height=10 border=0 /></td><td cellpadding=0><img src='http://www.chenweionline.cn/wp-content/plugins/statpresscn/images/sun.gif' width=10 height=10 border=0 /></td><td cellpadding=0><img src='http://www.chenweionline.cn/wp-content/plugins/statpresscn/images/sun.gif' width=10 height=10 border=0 /></td><td cellpadding=0><img src='http://www.chenweionline.cn/wp-content/plugins/statpresscn/images/sun.gif' width=10 height=10 border=0 /></td></tr>
</table>
<p><p>在用Telnet或Putty登录到远程Unix服务器后，vim是用户最常用的文档编辑工具之一。但在使用Telnet或Putty等字符界面工具远程登录服务器时，vim打开包含有中文内容的文件时经常会遇到中文乱码问题，这可能是由于Unix的默认编码方式、vim的默认编码方式以及终端所在操作系统的编码方式不一致导致的。</p>
<p>在安装WordPress的时候，我用vim打开wp-config-sample.php文件时发现里面的中文都变成了乱码，检查发现服务器上的vim全局配置中把默认编码设为了GB2312，而wp-config=sample.php文件的编码方式却是UTF-8。出于安全考虑，不可能通过修改vim的全局配置来解决这个中文乱码问题。不过Unix在每个用户的主目录中都有生成一个.vimrc的vim局部配置文件（如果没有该文件，用户可以自己建立此文件，只需保证其中的内容符合语法规定即可），这个配置文件规定了以此用户名登录的终端在调用vim命令时的默认配置。为了解决打开wp-config-sample.php时的乱码问题，我在.vimrc文件中添加了如下两行内容：<span id="more-4"></span></p>
<p><img class="aligncenter size-medium wp-image-24" title="vim乱码问题" src="http://www.chenweionline.cn/wp-content/uploads/2009/11/vim乱码问题-300x28.jpg" alt="vim乱码问题" width="370" height="34" /> 注意到上图中，修改了设置包括了termencoding, encoding和fileencodings三个选项，实现的功能是把用于终端的编码方式termencoding设为和vim的默认编码方式一致，并且设文件编码方式为utf-8, gb2312, gbk, ucs-bom和cp936（注意，这几个编码是有优先级关系的）.</p>
<p>.vimrc配置文件中和编码相关的参数主要包括以下四个：</p>
<ul>
<li><strong>encoding</strong></li>
</ul>
<p style="padding-left: 30px;">encoding参数设置的vim的内部编码方式，当我们设置了 &#8221;encoding&#8221; 之后，Vim 内部所有的 buffer、寄存器、脚本中的字符串等都将都使用这个编码方式。Vim 在工作的时候，如果编码方式与它的内部编码不一致，它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符，在这些字符就会丢失。因此，在选择 Vim 的内部编码的时候，<br />
一定要使用一种表现能力足够强的编码。由于 &#8221;encoding&#8221; 选项涉及到 Vim 中所有字符的内部表示，因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改 &#8221;encoding&#8221; 会造成非常多的问题。如果没有特别的理由，请始终将 &#8221;encoding&#8221; 设置为 &#8221;utf-8&#8221;。</p>
<ul>
<li><strong>termencoding</strong></li>
</ul>
<p style="padding-left: 30px;">termencoding 是 Vim 用于屏幕显示的编码，在显示的时候，Vim 会把内部编码转换为屏幕编码，再用于输出。内部编码中含有无法转换为屏幕编码的字符时，该字符会变成问号，但不会影响对它的编辑操作。如果 &#8221;termencoding&#8221; 没有设置，<br />
则直接使用 &#8221;encoding&#8221; 不进行转换。</p>
<ul>
<li><strong>fileencoding</strong></li>
</ul>
<p style="padding-left: 30px;">fileencoding参数规定了vim默认的文件编码方式。当 Vim 从磁盘上读取文件的时候，会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同，Vim 就会对编码进行转换。转换完毕后，Vim 会将 &#8221;fileencoding&#8221; 选项设置为文件的编码。当 Vim 存盘的时候，如果 &#8221;encoding&#8221; 和 &#8221;fileencoding&#8221; 不一样，Vim 也会将文件转换成fileencoding定义的编码方式保存。通过打开文件后设置 &#8221;fileencoding&#8221;，我们可以实现文件的编码转换。但是，由于&#8221;fileencoding&#8221; 是在打开文件的时候，由 Vim 进行探测后自动设置的。所以如果出现乱码，我们无法通过在打开文件后重新设置 &#8221;fileencoding&#8221; 来纠正乱码。</p>
<ul>
<li><strong>fileencodings</strong></li>
</ul>
<p style="padding-left: 30px;">fileencodings参数中可以设置多个编码方式以实现对文件编码的自动识别，因此它是fileencoding的复数形式。该参数的值是一个用逗号分隔的列表，列表中的每一项是一种编码的名称。当我们打开文件的时候，VIM 按顺序使用 fileencodings 中的编码进行尝试解码，如果成功的话，就使用该编码方式进行解码，并将 &#8221;fileencoding&#8221; 设置为这个值，如果失败的话，就继续试验下一个编码。</p>
<p style="padding-left: 30px;"><strong>Vim是如何支持多编码方式的呢？</strong></p>
<ul>
<li>Vim启动，根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。</li>
</ul>
<ul>
<li>读取需要编辑的文件，根据 fileencodings 中列出的字符编码方式逐一探测该<strong>文件编码</strong>方式。并设置 fileencoding 为探测到的，看起来是正确的字符编码方式。</li>
</ul>
<ul>
<li> 对比 fileencoding 和 encoding 的值，若不同则调用 iconv 将文件内容转换为encoding 所描述的字符编码方式，并且把转换后的内容放到为此文件开辟的 buffer 里，此时我们就可以开始编辑这个文件了。注意，完成这一步动作需要调用外部的 iconv.dll，你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。</li>
</ul>
<ul>
<li>编辑完成后保存文件时，再次对比 fileencoding 和 encoding 的值。若不同，再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式，并保存到指定的文件中。同样，这需要调用 iconv.dll由于 Unicode 能够包含几乎所有的语言的字符，而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小)，因此建议 encoding 的值设置为utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时, Vim自动探测文件的编码方式会更准确。在中文 Windows 里编辑的文件，为了兼顾与其他软件的兼容性<strong>,文件编码</strong>还是设置为 GB2312/GBK 比较合适，因此 fileencoding 建议设置为 chinese (chinese 是个别名，在 Unix 里表示 gb2312，在 Windows 里表示cp936，也就是 GBK 的代码页)。</li>
</ul>
<p>关于Vim的更详细信息，可以参考Vim doc项目的网站：<a title="Vim Doc site" href="http://vimcdoc.sourceforge.net/" target="_blank">http://vimcdoc.sourceforge.net/</a></p>
<p>Vim的中文文档下载地址：<a title="下载Vim中文文档" href="http://vimcdoc.sourceforge.net/vim_user_manual_603.0.pdf" target="_blank">http://vimcdoc.sourceforge.net/vim_user_manual_603.0.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenweionline.cn/archives/4.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

