<?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>Sat, 23 Jul 2011 12:09:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.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 />
]]></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>

