> 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)。轉換後請檢查。