# EBCDIC

In informatica, la sigla EBCDIC (dall'inglese Extended Binary Coded Decimal Interchange Code) indica un sistema di codifica dell'informazione a 8 bit usato in numerosi sistemi operativi di produzione IBM, sia per elaboratori di classe mainframe (ad es. z/OS, OS/390, VM e VSE) che per minicomputer (ad es. OS/400 e i5/OS). Viene inoltre utilizzato da varie piattaforme di altri produttori, quali BS2000/OSD di Fujitsu Siemens Computers, MPE/iX di Hewlett-Packard e Master Control Program (MCP) di Unisys. Deriva dalla codifica a 6 bit binary-coded decimal, utilizzata nelle schede perforate e nella maggior parte delle periferiche IBM della fine degli anni 1950 e dell'inizio degli anni 1960.

## Storia

La codifica EBCDIC, ideata da IBM tra il 1963 e il 1964, è stata presentata al pubblico in occasione del lancio della propria linea di mainframe System/360. Si trattava di una codifica a 8 bit in grado di estendere in modo rilevante il sistema BCD a 6 bit allora in uso; il suo sviluppo è stato indipendente rispetto alla ASCII, che è una codifica a 7 bit.
Curiosamente, IBM era anche tra i principali promotori del comitato di standardizzazione per la codifica ASCII. Tuttavia, l'azienda si trovava nell'impossibilità di approntare periferiche ASCII (ad es. perforatrici di schede) in tempo utile per il lancio del System/360, il che la spinse ad avvalersi del sistema EBCDIC come ripiego. D'altra parte, il System/360 fu un grande successo commerciale e ciò favorì un'ampia diffusione dell'EBCDIC.
Tutte le periferiche e i sistemi operativi IBM di classe mainframe, con l'eccezione di Linux on zSeries, impiegano in modo nativo la codifica EBCDIC e dispongono di software per la traduzione da e verso altri sistemi. Anche molte periferiche hardware sono in grado di gestire la traduzione tra più codifiche; i mainframe più recenti come il citato zSeries sono dotati di istruzioni hardware, a livello del processore, per rendere più rapida la conversione tra set di caratteri.
Al momento della sua realizzazione, l'EBCDIC offriva il vantaggio di una relativa facilità di inserimento dei dati per mezzo delle schede perforate; poiché tale supporto è ormai del tutto obsoleto, negli elaboratori moderni il sistema EBCDIC viene usato solo per compatibilità verso il basso. Non presenta infatti alcun vantaggio di carattere tecnico rispetto alle codepage basate sulla codifica ASCII quali le varie ISO-8859 e Unicode. Analogamente a quanto avviene per le codepage basate su set di caratteri ASCII Estesi a singolo byte, la maggior parte delle codepage EBCDIC non consente l'uso contemporaneo di più di due lingue (inglese e una seconda lingua) nell'ambito di ciascun database o file di testo.
Qualora sia necessario un supporto completo per testi multilingue, è necessario disporre di sistemi in grado di trattare un numero molto più elevato di caratteri. Di solito ciò viene realizzato attraverso opportune implementazioni della specifica Unicode. Il consorzio che gestisce la specifica ha proposto un formato di trasformazione Unicode (Unicode Transformation Format) per EBCDIC chiamato UTF-EBCDIC ma non ne è previsto l'uso in ambienti di interscambio aperti; peraltro, tale formato viene utilizzato molto di rado anche in sistemi del tutto basati su EBCDIC. I mainframe IBM supportano il formato UTF-16 ma non l'UTF-EBCDIC in modo nativo.

## Caratteristiche tecniche

Le codepage basate su EBCDIC e ASCII non sono compatibili tra loro. Poiché i computer sono in grado di elaborare solo dati numerici, entrambe le convenzioni assegnano specifici caratteri a tali numeri. Pertanto, identici valori numerici sono interpretati come caratteri diversi in funzione della codepage utilizzata. Per utilizzare dei dati memorizzati in EBCDIC è necessaria una conversione tra codepage per visualizzare correttamente le informazioni su elaboratori basati sulla codifica ASCII, quali i comuni personal computer.
Ciascun carattere della codifica EBCDIC occupa 8 bit (1 byte), diviso in due metà chiamate nibble. I 4 bit più significativi, chiamati zonatura, rappresentano la categoria di appartenenza del carattere, mentre i 4 bit meno significativi identificanti il carattere specifico vengono chiamati digit.
Nella codifica EBCDIC esiste una opportuna corrispondenza tra i codici esadecimali che rappresentano i caratteri e i codici di perforazione su schede per gli stessi; questa caratteristica era importante nel momento in cui il codice fu sviluppato. Una perforatrice IBM poteva infatti codificare una scheda a 12 righe con un massimo di 2 perforazioni per colonna, la prima in una posizione compresa nelle prime tre righe (le righe di zonatura) e la seconda nell'ambito delle restanti nove (le righe numeriche). Si poteva quindi interpretare la zonatura come un valore decimale compreso tra 0 e 3 e la parte numerica come una cifra compresa tra 0 (assenza di perforazione) e 9 (perforazione nella riga corrispondente). La prima versione della codifica EBCDIC rispondeva alla semplice formula:
    (0xf-zonatura)«4+numero
e definiva solo le 10 x 4 celle dell'angolo inferiore sinistro nella tabella riportata più oltre. La zonatura fu a quanto pare invertita per consentire l'ordinamento alfabetico delle lettere.
I primi 64 simboli (da 00 a 3F) sono dei caratteri di controllo, 33 dei quali possiedono un corrispettivo nella codifica ASCII. Una differenza rilevante tra i due schemi è la presenza di simboli separati per il solo ritorno carrello (carriage return, CR) e avanzamento riga (line feed, LF) nella codifica ASCII, dove vengono generalmente usati come terminatori di riga nei file di testo; viceversa, la codifica EBCDIC possiede due ulteriori caratteri per questo scopo: nuova riga (new line, NL) e nuova riga inversa (reverse newline, RNL). I restanti 31 codici di controllo vengono utilizzati per varie funzioni di controllo di terminali e dispositivi, in gran parte legate a peculiarità dell'hardware IBM.
Esistono più versioni di EBCDIC, personalizzate in funzione delle esigenze dei vari Paesi. Alcune nazioni asiatiche ne usano un'estensione a doppio byte che consente ai mainframe la visualizzazione di caratteri cinesi, giapponesi e coreani. Tale estensione contiene anche opportuni codici per il passaggio dalla modalità "a byte singolo" a quella "a doppio byte" [0x0E,0x0F].
Di norma IBM assegna a ciascuna codepage che definisce un codice numerico chiamato CCSID (Coded Character Set IDentifier). Occorre rilevare che un identico CCSID può prevedere diverse posizioni dei caratteri nell'ambito di una codepage. Ad esempio, il carattere newline in UNIX System Services su z/OS può corrispondere a valori numerici diversi rispetto agli altri sistemi operativi basati su EBCDIC. Di tale variabilità occorre tenere conto per evitare problemi nel trasferimento di dati testuali in codifica EBCDIC tra piatteforme diverse.

## Disposizione della codepage

La tabella che segue presenta la CCSID 500, una delle varianti della codifica EBCDIC. In tale disposizione, i simboli da 00 a 3F e FF sono caratteri di controllo, il 40 rappresenta lo spazio, il 41 lo spazio insecabile (non-breaking space) e CA il trattino opzionale (soft hyphen). Di ciascun carattere viene mostrato il corrispondente codice ISO 8859-1:
| | -0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | -9 | -A | -B | -C | -D | -E | -F |
| 0- | NUL 00 | SOH 01 | STX 02 | ETX 03 | SEL | HT 09 | RNL | DEL 7F | GE | SPS | RPT | VT 0B | FF 0C | CR 0D | SO 0E | SI 0F |
| 1- | DLE 10 | DC1 11 | DC2 12 | DC3 13 | RES ENP | NL | BS 08 | POC | CAN 18 | EM 19 | UBS | CU1 | IFS 1C | IGS 1D | IRS 1E | IUS ITB 1F |
| 2- | DS | SOS | FS | WUS | BYP INP | LF 0A | ETB 17 | ESC 1B | SA | SFE | SM SW | CSP | MFA | ENQ 05 | ACK 06 | BEL 07 |
| 3- | | | SYN 16 | IR | PP | TRN | NBS | EOT 04 | SBS | IT | RFF | CU3 | DC4 14 | NAK 15 | | SUB 1A |
| 4- | SP 20 | RSP A0 | â E2 | ä E4 | à E0 | á E1 | ã E3 | å E5 | ç E7 | ñ F1 | [ 5B | . 2E | < 3C | ( 28 | + 2B | ! 21 |
| 5- | & 26 | é E9 | ê EA | ë EB | è E8 | í E0 | î EE | ï EF | ì ED | ß DF | ] 5D | $ 24 | * 2A | ) 29 | ; 3B | ^ 5E |
| 6- | - 2D | / 2F | Â C2 | Ä C4 | À C0 | Á C1 | Ã C3 | Å C5 | Ç C7 | Ñ D1 | ¦ A6 | , 2C | % 25 | _ 5F | > 3E | ? 3F |
| 7- | ø F8 | É C9 | Ê CA | Ë CB | È C8 | Í CD | Î CE | Ï CF | Ì CC | ` 60 | : 3A | # 23 | @ 40 | ' 27 | = 3D | " 22 |
| 8- | Ø D8 | a 61 | b 62 | c 63 | d 64 | e 65 | f 66 | g 67 | h 68 | i 69 | « AB | » BB | ð F0 | ý FD | þ FE | ± B1 |
| 9- | ° B0 | j 6A | k 6B | l 6C | m 6D | n 6E | o 6F | p 70 | q 71 | r 72 | ª AA | º BA | æ E6 | ¸ B8 | Æ C6 | ¤ A4 |
| A- | µ B5 | ~ 7E | s 73 | t 74 | u 75 | v 76 | w 77 | x 78 | y 79 | z 7A | ¡ A1 | ¿ BF | Ð D0 | Ý DD | Þ DE | ® AE |
| B- | ¢ A2 | £ A3 | ¥ A5 | · B7 | © A9 | § A7 | ¶ B6 | ¼ BC | ½ BD | ¾ BE | ¬ AC | | 7C | ¯ AF | ¨ A8 | ´ B4 | × D7 |
| C- | { 7B | A 41 | B 42 | C 43 | D 44 | E 45 | F 46 | G 47 | H 48 | I 49 | SHY AD | ô F4 | ö F6 | ò F2 | ó F3 | õ F5 |
| D- | } 7D | J 4A | K 4B | L 4C | M 4D | N 4E | O 4F | P 50 | Q 51 | R 52 | ¹ B9 | û FB | ü FC | ù F9 | ú FA | ÿ FF |
| E- | \ 5C | ÷ F7 | S 53 | T 54 | U 55 | V 56 | W 57 | X 58 | Y 59 | Z 5A | ² 82 | Ô D4 | Ö D6 | Ò D2 | Ó D3 | Õ D5 |
| F- | 0 30 | 1 31 | 2 32 | 3 33 | 4 34 | 5 35 | 6 36 | 7 37 | 8 38 | 9 39 | ³ 83 | Û D8 | Ü DC | Ù D9 | Ú DA | EO |