如何在VIM中查看EBCDIC格式的文件?

7

在VIM中查看EBCDIC格式的文件,最好的方法是什么?


1
:echo has("ebcdic") 返回 0 还是 1 - romainl
@romainl 它返回 0。 - Aaron Thomas
现在大多数 Vim 二进制文件都没有 ebcdic 支持(我在几个发行版上测试过)。您可以执行 has("ebcdic") 来检查,如 romainl 所建议的,或者运行 vim --version 并搜索 +ebcdic/-ebcdic(支持/不支持)。您可能需要编译 Vim 以获得 ebcdic 支持。然而,今天大多数 ebcdic 用于古老的通信(例如芯片卡和 ATM),这些通信曾经在大型机上运行。您真的需要看到 ebcdic 吗?还是看到十六进制字节(例如 xxd <file>)就足够了?(此外,我们有 vi.SE 专门回答 Vim 相关问题) - grochmal
@grochmal - 谢谢你。不幸的是,十六进制字节并不足够,尽管它很古老而且我不想处理它,但我想引入EBCDIC支持。 如果您将您的评论作为答案,我会标记它已回答。 - Aaron Thomas
1
等等,我完全错了。我去查找Vim代码以了解如何启用ebcdic,结果发现+ebcidic/-ebcdic的含义完全不同。为了支持ebcidic,Vim实际上需要+iconv功能。我很快就会添加答案(一旦我测试过这个)。 - grochmal
1个回答

14

在大型机上

首先,如果 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


那么没有办法同时编译带有ASCII和EBCDIC支持的vim吗? - Alexej Magura
相反,如果您编译了 incov,那么您不仅拥有 EBCDIC 支持,而且还可以使用 iconv 支持的所有编码(例如所有的 CJK 编码)。但是,在主机上,您只能获取 ASCII 或主机的 EBCDIC 页面。(我从未见过可以编译 iconv 的主机) - grochmal
我仍然不明白为什么 EBCDIC 编码在 vim 中不能像其他编码一样工作。 - gsl
@gsl iconv用法是vim中的主要编码库,即vim中最常见的编码处理方式是通过iconv。其他选项适用于不需要太多资源的较小构建。 - grochmal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接