在VIM中查看EBCDIC格式的文件,最好的方法是什么?
首先,如果 Vim 是在默认编码为 EDCDIC 的系统上编译并运行的(例如使用 ANSI C 编译器的 IBM 大型机),那么 Vim 默认会以系统的代码页打开 EBCDIC 文件。这样的 Vim 实例将具有:
has("ebcdic")
求值为1
。并且当使用--version
调用时,Vim将打印:
+ebcdic
如果Vim实例没有在EBCDIC环境中进行编译,则永远不会将has("ebcdic")
求值为true。Vim的这个特性很重要,因为在纯粹的EBCDIC环境中,其他功能的行为是不同的。
然而,目前大多数系统都不使用EBCDIC代码页。当需要在更流行的系统上编辑以EBCDIC代码页编码的文件时,Vim会使用iconv
库。实际上,为了能够打开以EBCDIC代码页编码的文件,Vim需要被编译为支持iconv
。可以通过评估以下内容来测试iconv
支持:
has("iconv")
或者寻找
+iconv
vim --version
输出中的字符串。
EBCDIC 有多个代码页,Vim 只能使用编译时与 iconv
库支持的代码页。要检查可用的代码页,您可以使用与 iconv
库一起提供的 iconv
实用程序:
iconv --list
现在,假设我们有一个名为myfile
的文件,它是用EBCDIC-US
代码页(也称为EBCDIC-037
代码页)编码的,并且系统上安装了支持此代码页的iconv
。
在打开文件之前,我们需要将Vim的编码设置为utf-8
,在~/.vimrc
中添加以下内容:
set enc=utf-8
:h fenc
建议如果通过 iconv
进行文件转换,必须将编码设置为 utf-8
,否则在写回文件时可能会出现数据丢失。
现在我们使用 vim myfile
打开文件,看到了乱码。这很正常,我们需要使用 iconv
执行转换:
:e ++enc=EBCDIC-US
Vim现在将以utf-8
格式显示文件,但使用iconv
转换实时保存文件为EBCDIC-US
格式。
IBM的代码页命名与映射关系:
EBCDIC-037
EBCDIC-273
EBCDIC-500
...
和 iconv
的名称
EBCDIC-US
EBCDIC-AT-DE-A
EBCDIC-BE
...
翻译通常并不容易。然而,如果显示编码(enc
)设置为utf-8
,那么尝试使用不同的代码页就不应该有问题。
:e ++enc=EBCDIC-US
:e ++enc=EBCDIC-AT-DE-A
直到找到正确的转换为止。
附注:如果您有更多与Vim相关的问题,请考虑使用vi.SE。
incov
,那么您不仅拥有 EBCDIC 支持,而且还可以使用 iconv
支持的所有编码(例如所有的 CJK 编码)。但是,在主机上,您只能获取 ASCII 或主机的 EBCDIC 页面。(我从未见过可以编译 iconv
的主机) - grochmal
:echo has("ebcdic")
返回0
还是1
? - romainlebcdic
支持(我在几个发行版上测试过)。您可以执行has("ebcdic")
来检查,如 romainl 所建议的,或者运行vim --version
并搜索+ebcdic
/-ebcdic
(支持/不支持)。您可能需要编译 Vim 以获得ebcdic
支持。然而,今天大多数ebcdic
用于古老的通信(例如芯片卡和 ATM),这些通信曾经在大型机上运行。您真的需要看到ebcdic
吗?还是看到十六进制字节(例如xxd <file>
)就足够了?(此外,我们有 vi.SE 专门回答 Vim 相关问题) - grochmalebcdic
,结果发现+ebcidic
/-ebcdic
的含义完全不同。为了支持ebcidic
,Vim实际上需要+iconv
功能。我很快就会添加答案(一旦我测试过这个)。 - grochmal