在Windows上使用Vim打开UCS-2le文件

在Windows上使用Vim打开UCS-2le文件,vim,encoding,ucs2,Vim,Encoding,Ucs2,我在WinXP上使用Vim 7.3。我使用的XML文件是由我工作的应用程序生成的,该应用程序使用UCS-2le编码编写它们。在vim wiki上阅读了几篇关于编码的文章后,我发现给出了以下建议,即在vimrc中设置我的文件编码: set fileencodings=ucs-bom,utf-8 该文件的第一个字符是FF EE(已确认使用HxD查看),但Vim无法正确打开该文件。我可以在vimrc中正确打开UCS-2le文件: set fileencodings=ucs-2le, utf-8 但

我在WinXP上使用Vim 7.3。我使用的XML文件是由我工作的应用程序生成的,该应用程序使用UCS-2le编码编写它们。在vim wiki上阅读了几篇关于编码的文章后,我发现给出了以下建议,即在vimrc中设置我的文件编码:

set fileencodings=ucs-bom,utf-8
该文件的第一个字符是FF EE(已确认使用HxD查看),但Vim无法正确打开该文件。我可以在vimrc中正确打开UCS-2le文件:

set fileencodings=ucs-2le, utf-8
但是现在我的UTF-8文件乱七八糟

有什么建议吗?我通常在没有MSwin的情况下运行Gvim(如果这很重要的话)。我使用很少的插件。我关于文件编码的实际vimrc设置为:

set encoding=utf-8
set fileencodings=ucs-bom,utf-8,ucs-2le,latin1
第三个位置的ucs-2le条目似乎没有什么区别。据我所知,第一个条目(set encoding)是Vim在其缓冲区内部使用的编码,而第二个条目(set fileencoding)处理Vim读写文件时的编码。因此,在我看来,由于文件有一个字节顺序标记,ucs bom作为setfileencodings中的第一个条目应该捕获它。据我所知,vim似乎不知道这个文件是每个字符16字节

注意:在打开ucs-2le文件时,我可以/确实通过手动设置文件编码来解决此问题:

edit ++enc=ucs2-le

干杯。

解决了这个问题。我不确定我做了什么,但注意到的修复现在可以很好地读取和写入我的UCS-2文件-尽管原因不明,但没有立即执行(我刚刚重新启动了Vim吗?)。我可以尝试反向修复,看看哪一个是关键的更改,但以下是我所做的(另请参见我在7月27日的评论):

  • 将AutoFenc.vim插件放入我的插件文件夹(自动检测文件编码()
  • 将iconv.dll和新版本的libintl.dll添加到我的vim73文件夹()
  • 编辑vimrc如下
vimrc现在包含(最后一位只是通过在状态行中显示文件编码,更容易查看文件编码的情况):

默认情况下使用utf-8 设置编码=utf-8 设置文件编码=ucs bom、utf-8、ucs-2le、拉丁1 “始终显示状态行 设置laststatus=2 “在状态行中显示编码http://vim.wikia.com/wiki/Show_fileencoding_and_bomb_in_the_status_line 如果有(“状态行”)
set statusline=%Hm,这适用于我上次提到的设置。Vim 7.3,Windows Vista,默认配置。Does
:echo有('iconv')
产生
1
(即,你能在字符集之间转换吗)?嗨。
:echo有('iconv'))
产生
0
。不过,我可以在字符集之间转换,因为
edit++enc=ucs2 le
可以工作。查看
:version
在包含的功能列表中产生
+iconv\dyn
。实际上,还有一些进一步的线索(我不知道这是否有用):如果我通过创建一个新的utf8文件,使用
set fileencoding=ucs-2le
将编码设置为ucs-2le,并尝试保存它(失败),实际上无法将utf8文件转换为ucs-2le。但我可以打开ucs-2le文件,在使用
:edit++enc=ucs2 le
命令后在缓冲区中读取该文件,然后在进行编辑后将其另存为(仍然)一个ucs-2le文件——通过使用十六进制编辑器查看该文件来确认。但这对我来说并没有什么意义。至少它显示了ucs2编码的更多问题!找到这篇文章时有些兴奋,但毫无乐趣:[link](),也在vim.org上的“额外文件”中描述:[link]()。我将iconv.dll放在我的vim73文件夹中,但仍然无法从头创建utf-8并将其作为ucs2 le写入:(叹气。没什么大不了的。我有时查看但很少编辑这些文件-如果每次打开这样的文件查看其内容时不必使用
:edit++enc=ucs2 le
,那就太好了。出于所有其他目的,我使用ansii或utf8文件都没有问题。这只是关于更改文件编码的最后说明。许多网页都给出了答案。)关于使用Vim通过调用文件名和iconv库的命令更改文件编码的说明。如果文件已在Vim缓冲区中,则也很容易:
:set fileencoding=utf8
,如果需要删除字节顺序标记,则使用这些命令另外添加
:setlocal nobomb
我已经能够将我的UCS文件更改为UTF8文件(当/如果需要的话)。我正在努力在您的答案中找到提到的dll,然后我发现,我只在
vimrc
中添加了两行
set fileencodings+=UCS-2le
set encoding=utf-8
,这就解决了我的问题。
"use utf-8 by default
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,ucs-2le,latin1

"always show status line
set laststatus=2

"show encoding in status line http://vim.wikia.com/wiki/Show_fileencoding_and_bomb_in_the_status_line
if has("statusline")
 set statusline=%<%f\ %h%m%r%=%{\"[\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\",B\":\"\").\"]\ \"}%k\ %-14.(%l,%c%V%)\ %P
endif