> ebcdic | ibm | 传统系统 <
// EBCDIC - 扩展二进制编码十进制交换码
IBM 主机
IBM 主机系统使用的标准字符编码。
多种代码页
支持不同的 EBCDIC 代码页和地区设置。
遗留系统支持
处理传统主机数据和迁移项目的关键工具。
>> 技术说明
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)对照
| 字符 | ASCII | EBCDIC (CP037) |
|---|---|---|
| A | 41 | C1 |
| I | 49 | C9 |
| J | 4A | D1 |
| R | 52 | D9 |
| S | 53 | E2 |
| Z | 5A | E9 |
| a | 61 | 81 |
| z | 7A | A9 |
| 0 | 30 | F0 |
| 9 | 39 | F9 |
| ␠ | 20 | 40 |
| . | 2E | 4B |
| ! | 21 | 5A |
| \n | 0A | 25 |
// 代码与命令行中的 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)。转换后请检查。