> ebcdic | ibm | legado <
// EBCDIC - Extended Binary Coded Decimal Interchange Code
Mainframe IBM
Codificação de caracteres padrão para sistemas mainframe IBM.
Várias variantes
Suporte a diferentes páginas de código EBCDIC e configurações regionais.
Suporte a legado
Essencial para trabalhar com dados legados de mainframe.
>> informações técnicas
Como o EBCDIC funciona:
EBCDIC (Extended Binary Coded Decimal Interchange Code) é uma codificação de caracteres de 8 bits desenvolvida pela IBM. Diferentemente do ASCII, que agrupa caracteres relacionados, o EBCDIC os distribui ao longo de todo o espaço de códigos devido à sua origem em cartões perfurados. Diferentes páginas de código EBCDIC dão suporte a vários idiomas e regiões; o EBCDIC 037 é a variante mais comum para os EUA e o Canadá.
Exemplos EBCDIC vs ASCII:
Mapeamento de caracteres (EBCDIC 037): Caractere | ASCII | EBCDIC ----------|-------|-------- Espaço | 0x20 | 0x40 A | 0x41 | 0xC1 B | 0x42 | 0xC2 0 | 0x30 | 0xF0 1 | 0x31 | 0xF1 a | 0x61 | 0x81 b | 0x62 | 0x82 "ABC" em ASCII: 41 42 43 "ABC" em EBCDIC: C1 C2 C3 "123" em ASCII: 31 32 33 "123" em EBCDIC: F1 F2 F3
Por que usar EBCDIC:
- ▸Necessário em ambientes de mainframe IBM
- ▸Compatibilidade com sistemas legados
- ▸Projetos de migração de dados
- ▸Desenvolvimento em COBOL e mainframe
- ▸Preservação de dados históricos
>> perguntas frequentes
O que é EBCDIC?
EBCDIC (Extended Binary Coded Decimal Interchange Code) é uma codificação de caracteres de 8 bits desenvolvida pela IBM em 1963. É usada principalmente em sistemas mainframe e midrange da IBM. Diferentemente do ASCII, a disposição dos caracteres em EBCDIC reflete sua herança dos cartões perfurados.
Por que o EBCDIC é diferente do ASCII?
O EBCDIC evoluiu a partir de códigos de cartões perfurados, nos quais furos em posições específicas representavam caracteres. Isso resultou em uma disposição não contígua — as letras não são sequenciais e há lacunas entre grupos de letras. O ASCII foi projetado do zero pensando na eficiência, sendo portanto mais lógico para a computação moderna.
O que são páginas de código EBCDIC?
O EBCDIC possui várias variantes chamadas páginas de código para diferentes idiomas e regiões. Exemplos comuns incluem: EBCDIC 037 (EUA/Canadá), EBCDIC 500 (internacional), EBCDIC 875 (grego) e EBCDIC 1047 (Open Systems). Cada página de código mapeia os caracteres de forma diferente para atender às necessidades locais.
Onde o EBCDIC ainda é usado?
O EBCDIC ainda é amplamente utilizado em ambientes mainframe IBM (z/OS, z/VM, z/VSE), em sistemas bancários e financeiros, em sistemas governamentais legados e em aplicações COBOL. Muitas organizações mantêm sistemas EBCDIC para processos de negócio críticos que funcionam de forma confiável há décadas.
// Mapeamento ASCII ↔ EBCDIC (CP037)
| Caractere | 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 no código e na linha de comando
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")
>> Mais perguntas
P: Por que as letras A–Z não formam um bloco contínuo em EBCDIC?
R: O EBCDIC vem das zonas dos cartões perfurados: A–I em C1–C9, J–R em D1–D9, S–Z em E2–E9, com lacunas entre elas. Por isso não se converte com uma simples soma.
P: Qual página de código devo escolher?
R: As mais comuns são CP037 (EUA/Canadá), CP500 (internacional) e CP1047 (z/OS Unix). Elas diferem sobretudo em sinais como [ ] ^ ! |. Escolha a que gerou os dados.
P: O que acontece com as quebras de linha na conversão?
R: Arquivos de mainframe costumam ter registros de tamanho fixo sem quebra de linha; os caracteres de fim de linha (LF/NEL) ficam em posições diferentes conforme a página de código (p. ex. LF = 25 no CP037). Verifique-os após converter.