转换 | 编码 | 主机

> ebcdic | ibm | 传统系统 <

// EBCDIC - 扩展二进制编码十进制交换码

0 字符
0 字符
[MAINFRAME]

IBM 主机

IBM 主机系统使用的标准字符编码。

[CODE PAGES]

多种代码页

支持不同的 EBCDIC 代码页和地区设置。

[LEGACY]

遗留系统支持

处理传统主机数据和迁移项目的关键工具。

>> 技术说明

EBCDIC 的工作原理:

EBCDIC(Extended Binary Coded Decimal Interchange Code,扩展二进制编码十进制交换码)是 IBM 提出的 8 位字符编码。与按顺序排列相关字符的 ASCII 不同,EBCDIC 受穿孔卡片历史的影响,将字符分散在整个编码空间中。不同的 EBCDIC 代码页用于支持不同语言和地区,其中 EBCDIC 037 是美国和加拿大最常见的版本。

EBCDIC 与 ASCII 对比示例:

字符映射示例(EBCDIC 037):

字符 | ASCII | EBCDIC
------|-------|--------
空格 | 0x20  | 0x40
  A   | 0x41  | 0xC1
  B   | 0x42  | 0xC2
  0   | 0x30  | 0xF0
  1   | 0x31  | 0xF1
  a   | 0x61  | 0x81
  b   | 0x62  | 0x82

"ABC" 在 ASCII 中: 41 42 43
"ABC" 在 EBCDIC 中: C1 C2 C3

"123" 在 ASCII 中: 31 32 33
"123" 在 EBCDIC 中: F1 F2 F3

为什么仍然使用 EBCDIC:

  • ▸IBM 主机环境中的必备编码
  • ▸兼容现有遗留系统
  • ▸数据迁移与批处理项目
  • ▸COBOL 与主机应用开发
  • ▸长期历史数据的保存

>> 常见问题

什么是 EBCDIC?

EBCDIC(Extended Binary Coded Decimal Interchange Code,扩展二进制编码十进制交换码)是 IBM 在 1963 年提出的 8 位字符编码。它主要用于 IBM 主机和中型机系统。与 ASCII 不同,EBCDIC 的字符排列方式延续了穿孔卡片时代的设计。

EBCDIC 与 ASCII 有何不同?

EBCDIC 源自穿孔卡片编码:卡片上特定位置的孔代表不同字符,这导致字符分布并不连续——字母并非按顺序排列,中间穿插着空档。ASCII 则是从零开始为现代计算设计的高效编码,因此结构更直观。

什么是 EBCDIC 代码页?

EBCDIC 针对不同语言和地区有多种变体,称为代码页。常见示例包括:EBCDIC 037(美国/加拿大)、EBCDIC 500(国际)、EBCDIC 875(希腊语)、EBCDIC 1047(开放系统)等。每种代码页采用不同的字符映射,以满足本地需求。

现在还在哪些场景中使用 EBCDIC?

EBCDIC 仍广泛用于 IBM 主机环境(z/OS、z/VM、z/VSE)、银行与金融系统、政府遗留系统以及大量 COBOL 应用中。许多机构依然维护基于 EBCDIC 的系统,以支撑已经稳定运行数十年的关键业务流程。

// ASCII ↔ EBCDIC(CP037)对照

字符ASCIIEBCDIC (CP037)
A41C1
I49C9
J4AD1
R52D9
S53E2
Z5AE9
a6181
z7AA9
030F0
939F9
␠2040
.2E4B
!215A
\n0A25

// 代码与命令行中的 EBCDIC

Linux        iconv -f IBM037 -t UTF-8 input.dat > output.txt
             iconv -f UTF-8 -t IBM037 input.txt > output.dat
dd           dd conv=ascii  < ebcdic.dat > ascii.txt
             dd conv=ebcdic < ascii.txt  > ebcdic.dat
Python       data.decode('cp037')   /   text.encode('cp037')
Java         new String(bytes, "Cp037")

>> 更多问题

问:为什么 EBCDIC 中 A–Z 不是连续的一段?

答:EBCDIC 源自穿孔卡片的区位:A–I 为 C1–C9,J–R 为 D1–D9,S–Z 为 E2–E9,中间有空隙,因此无法通过简单加减换算。

问:应该选择哪个代码页?

答:常见的有 CP037(美国/加拿大)、CP500(国际)和 CP1047(z/OS Unix)。差异主要在 [ ] ^ ! | 等符号上。请选择生成数据时使用的代码页。

问:转换时换行符会怎样?

答:大型机文件常是没有换行符的定长记录;行结束符(LF/NEL)在不同代码页中的位置也不同(例如 CP037 中 LF = 25)。转换后请检查。

其他语言