<?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>Rainux's Journal&#187; gVim Archives  &laquo; Rainux&#039;s Journal</title>
	<atom:link href="http://rainux.org/tag/gvim/feed/" rel="self" type="application/rss+xml" />
	<link>http://rainux.org</link>
	<description>Rubyist of Vimmer</description>
	<lastBuildDate>Tue, 10 Aug 2010 23:41:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>解决 gvimext 在 UTF-8 locale 下乱码的问题</title>
		<link>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98</link>
		<comments>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98#comments</comments>
		<pubDate>Tue, 19 Jun 2007 20:43:24 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[gVim]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/06/20/155</guid>
		<description><![CDATA[gvimext.dll 是一个为 Windows 里任意文件的右键菜单 (context menu) 添加“用 Vim 编辑”菜单项的 shell 扩展，随 gVim 一起安装。 但是无论是官方的安装版本，还是我自己编译的版本，在使用 UTF-8 locale 时 (比如设置环境变量 LANG 为 zh_CN.UTF-8) 这个右键菜单项都会显示乱码。其实原因很简单，Windows 并不原生支持 UTF-8 编码，所以直接使用 TextOut() 之类的 API 输出 UTF-8 编码的消息文本肯定会显示乱码。 曾经尝试修改 gvimext.cpp，在里面覆盖环境变量 LANG 的值，去掉末尾的 .UTF-8，但这样做的结果是导致 gvimext.dll 寄生进程 explorer.exe 或 TotalCmd.exe (如果是在 Total Commander 中使用右键菜单的话) 的 LANG 也被修改，造成由 explorer 启动的 gVim 的 LANG 也成了被去掉 .UTF-8 [...]]]></description>
			<content:encoded><![CDATA[<p>gvimext.dll 是一个为 Windows 里任意文件的右键菜单 (context menu) 添加“用 Vim 编辑”菜单项的 shell 扩展，随 gVim 一起安装。</p>

<p>但是无论是官方的安装版本，还是我自己编译的版本，在使用 UTF-8 locale 时 (比如设置环境变量 LANG 为 zh_CN.UTF-8) 这个右键菜单项都会显示乱码。其实原因很简单，Windows 并不原生支持 UTF-8 编码，所以直接使用 TextOut() 之类的 API 输出 UTF-8 编码的消息文本肯定会显示乱码。</p>

<p>曾经尝试修改 gvimext.cpp，在里面覆盖环境变量 LANG 的值，去掉末尾的 .UTF-8，但这样做的结果是导致 gvimext.dll 寄生进程 explorer.exe 或 TotalCmd.exe (如果是在 Total Commander 中使用右键菜单的话) 的 LANG 也被修改，造成由 explorer 启动的 gVim 的 LANG 也成了被去掉 .UTF-8 的值 (因为子进程默认会继承父进程的环境变量)。后来又想起了 Cygwin 里的 OUTPUT&#95;CHARSET 环境变量，可以在 gvimext 里将获取到的 UTF-8 消息文本使用 iconv() 转换为 OUTPUT_CHARSET 设定的编码，这样问题就可以圆满的解决了。</p>

<p>直到今天打算来实施这个想法时，又回头去看了一下以前 Google 到的这篇 <a href="http://www.linuxselfhelp.com/HOWTO/Unicode-HOWTO-3.html">The Unicode HOWTO: Locale setup</a>，才发现原来 glibc 本来就有这样的自动编码转换能力，并且 2.2 以后的版本也不再需要设定 OUTPUT&#95;CHARSET 了。偶太无知无畏了……</p>

<p>那么 gVim 安装版里的 libintl.dll 肯定不是 gcc 编译的，所以没有自动编码转换能力导致乱码，用 PEiD 看了一下果然是 MS VC 6.0 编译。接下来就简单了，去 <a href="http://gnuwin32.sourceforge.net/">GnuWin32</a> 的 <a href="http://gnuwin32.sourceforge.net/packages/libintl.htm">LibIntl</a> 页面下载 Binaries 和 Dependencies 两个压缩包，取得其中的 libintl3.dll 和 libiconv2.dll，前者改名为 libintl.dll (gVim 被硬编码为只尝试载入 libintl.dll 这个文件，想了想没必要改源代码，因为以后 LibIntl 出了新版本 libintl3.dll 里的 3 还会变化)。然后将这两个文件放到 PATH 环境变量中列出的任意一个目录里，最后删掉 gVim 安装目录下的 libintl.dll，OK，一切都是那么完美了。:p</p>

	标签：<a href="http://rainux.org/tag/gvim/" title="gVim" rel="tag">gVim</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://rainux.org/vim-gvimvim-on-win32" title="正确设置 Vim 的字符编码选项 (gVim/Vim on Win32 中文环境) (October 20, 2005)">正确设置 Vim 的字符编码选项 (gVim/Vim on Win32 中文环境)</a> (9)</li>
	<li><a href="http://rainux.org/%e4%bd%bf%e7%94%a8-svn-%e6%9d%a5%e7%ae%a1%e7%90%86-vim-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-vimrc-%e5%8f%8a%e6%8f%92%e4%bb%b6%e9%9b%86" title="使用 SVN 来管理 Vim 配置文件 .vimrc 及插件集 (November 5, 2007)">使用 SVN 来管理 Vim 配置文件 .vimrc 及插件集</a> (2)</li>
	<li><a href="http://rainux.org/vim-70c-beta-win32-binary" title="Vim 7.0c beta Win32 binary (April 3, 2006)">Vim 7.0c beta Win32 binary</a> (0)</li>
	<li><a href="http://rainux.org/%e7%bc%96%e5%86%99inf%e6%96%87%e4%bb%b6%e8%bf%9b%e8%a1%8c%e6%96%87%e4%bb%b6%e5%ae%89%e8%a3%85" title="编写INF文件进行文件安装[转载] (March 2, 2006)">编写INF文件进行文件安装[转载]</a> (1)</li>
	<li><a href="http://rainux.org/abcwindows-xp-embedded" title="智能 ABC 在 Windows XP Embedded 下面选字窗口乱码的问题 (February 22, 2005)">智能 ABC 在 Windows XP Embedded 下面选字窗口乱码的问题</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
