# Extended Binary Coded Decimal Interchange Code

L’Extended Binary Coded Decimal Interchange Code (EBCDIC) est un mode de codage des caractères sur 8 bits créé par IBM à l'époque des cartes perforées. Il existe au moins 6 versions différentes bien documentées (et de nombreuses variantes parfois créées par des concurrents d’IBM), incompatibles entre elles. Ce mode de codage a été critiqué pour cette raison, mais aussi parce que certains caractères de ponctuation ne sont pas disponibles dans certaines versions. Ces disparités ont parfois été interprétées comme un moyen pour IBM de conserver ses clients captifs.
EBCDIC est encore utilisé dans les systèmes AS/400 d’IBM ainsi que sur les mainframes sous MVS (aujourd'hui z/OS), VM ou DOS/VSE.

## Historique

La disposition apparemment « étrange » du codage EBCDIC est historique et provient des anciens lecteurs de bandes et cartes perforées, qui devaient pouvoir être lues et percées manuellement par un humain en utilisant le système décimal plus mnémotechnique (et il était lui-même dérivé de l’ancien jeu de caractère télégraphique sur 5 bits).
Les bits de poids fort sont apparus après et ont permis de coder dans une colonne supplémentaire de perforation les distinctions entre chiffres et lettres, ou entre minuscules et majuscules. Le jeu était conçu pour qu’à chaque caractère corresponde aussi au moins un trou, afin de permettre la synchronisation des lecteurs de bandes perforées, c’est pourquoi la colonne 0 était à l’origine inutilisée pour les lettres, les chiffres ayant un trou dédié supplémentaire correspondant à un bit de poids fort.
Le jeu EBCDIC à l’origine était bien un jeu sur 7 bits, le huitième étant alors uniquement utilisé sur les cartes perforées pour indiquer que la colonne de perforation était bien occupée par un caractère codé (c’est pourquoi les principaux codes EBCDIC occupent la seconde moitié de la table).
De même, les ponctuations étaient codées aussi de façon visuelle et mnémotechnique, et pouvaient facilement être distinguées des chiffres et lettres par le fait qu’elles n'avait aucun trou dans les positions binaires correspondant aux marques de chiffres ou de lettres.
L’absence de toute perforation dans une colonne de perforations était interprétée comme du bourrage non signifiant, lié à la technologie employée (ce code en début de table correspond aujourd’hui au caractère de contrôle C0 “NUL”). De même, on pouvait corriger une erreur manuelle de perforation en perforant toutes les positions d’une colonne, et donc la dernière position est aussi un caractère de bourrage non signifiant (ce code en fin de table correspond aujourd’hui au caractère de commande C1 “APC”, fonction plutôt dévolue au caractère de contrôle C0 “DEL” de l’ISO/CEI 646 et de l’ASCII mais dont l’usage est plus ambigu).
L’EBCDIC est donc le fruit d’une évolution historique bien plus ancienne (développée de longue date par IBM en continuité avec les anciens systèmes télégraphiques) que l’ASCII (plus pratique à manipuler dans les programmes) qui l’a remplacé ensuite pratiquement partout et a donné ensuite lieu à une normalisation dans l’ISO 646.
Les bandes et cartes perforées ont cependant continué à être utilisées avec l’EBCDIC jusque vers les années 1990, par exemple en Turquie pour les échanges de données militaires alors que les problèmes de compatibilité des systèmes d’enregistrement magnétiques ou des réseaux étaient encore loin d’être tous résolus.
Le succès des normes de communication entre systèmes hétérogènes (notamment TCP/IP et l’Internet, ainsi que les systèmes de cryptographie pour la transmission sécurisée et moins coûteuse via des réseaux publics) a mis fin à l’intérêt de l’EBCDIC pour tout nouveau développement, et les nombreuses versions nationales de l’EBCDIC ont également de moins en moins d’intérêt depuis l’apparition de l’UTF-EBCDIC.

## Exemple de codage

Ce tableau représente le codage d’une variante d’EBCDIC compatible avec l’ISO/CEI 8859-1. Les caractères codés de 0x00 à 0x3F ainsi que 0xFF sont des caractères de contrôle, 0x40 est l’espace, 0x41 est l’espace insécable. Le caractère codé en 0x54 est le tiret de césure visible uniquement en fin de ligne.
Cette variante est compatible, octet par octet, avec l’UTF-EBCDIC qui utilise les positions variantes colorées en vert pour coder les caractères Unicode (hors de l’ASCII et des codes de contrôle) sous forme de séquences d’octets.
Chaque variante nationale ou internationale de l’EBCDIC est codée d’après cette table (cependant des permutations sont possibles entre deux CCSID pour les mêmes caractères). Toutes les variantes de l’EBCDIC ne codent pas les lettres minuscules latines de base, au contraire des jeux de caractères basés sur l’ISO/CEI 646 ou ISO/CEI 8859.
D’autre part certaines variantes nationales de l’ISO 646 (ou autres jeux de caractères compatibles avec cette norme) contiennent des positions variantes supplémentaires, invariantes dans les jeux de caractères basés sur l’EBCDIC.
Enfin, les positions 0x5A et 0x7F de l’EBCDIC sont variantes — la plupart des variantes EBCDIC y codent respectivement le point d’exclamation et le guillemet anglais (double quote) — au contraire des caractères correspondants des variantes nationales de l’ISO/CEI 646 aux positions respectives 0x21 et 0x22.
Sur les systèmes EBCDIC, le saut de ligne est normalement codé avec le caractère de contrôle C1 “NEL” (U+0085 en Unicode, ou 0x25 dans toutes les variantes standard EBCDIC) et non avec les caractères de contrôle C0 “CR” et/ou “LF” de l’ISO 646 et de l’ASCII (U+000D et/ou U+000A, c’est-à-dire 0x0D et/ou 0x15 en EBCDIC, où ces commandes ont une fonction bien définie et unique de gestion de position du curseur sur un terminal, ou bien permettent de distinguer les sauts de lignes forcés dans un même paragraphe, ou encore permettaient d’afficher une ligne en surimpression pour produire des caractères gras, soulignés, ou accentués supplémentaires).
Jeu de caractères EBCDIC (variante compatible avec l’UTF-EBCDIC). :
| Quartet haut | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) | Quartet bas (toutes les valeurs sont en hexadécimal) |
| Quartet haut | ...0 | ...1 | ...2 | ...3 | ...4 | ...5 | ...6 | ...7 | ...8 | ...9 | ...A | ...B | ...C | ...D | ...E | ...F |
| 0... | NUL 0000 | SOH 0001 | STX 0002 | ETX 0003 | ST 009C | HT 0009 | SSA 0086 | DEL 007F | EPA 0097 | RI 008D | SS2 008E | VT 000B | FF 000C | CR 000D | SO 000E | SI 000F |
| 1... | DLE 0010 | DC1 0011 | DC2 0012 | DC3 0013 | OSC 009D | LF 000A | BS 0008 | ESA 0087 | CAN 0018 | EM 0019 | PU2 0092 | SS3 008F | FS 001C | GS 001D | RS 001E | US 001F |
| 2... | PAD 0080 | HOP 0081 | BPH 0082 | NBH 0083 | IND 0084 | NEL 0085 | ETB 0017 | ESC 001B | HTS 0088 | HTJ 0089 | VTS 008A | PLD 008B | PLU 008C | ENQ 0005 | ACK 0006 | BEL 0007 |
| 3... | DCS 0090 | PU1 0091 | SYN 0016 | STS 0093 | CCH 0094 | MW 0095 | SPA 0096 | EOT 0004 | SOS 0098 | SGCI 0099 | SCI 009A | CSI 009B | DC4 0014 | NAK 0015 | PM 009E | SUB 001A |
| 4... | SP 0020 | NBSP 00A0 | ¡ 00A1 | ¢ 00A2 | £ 00A3 | ¤ 00A4 | ¥ 00A5 | ¦ 00A6 | § 00A7 | ¨ 00A8 | © 00A9 | . 002E | < 003C | ( 0028 | + 002B | | 007C |
| 5... | & 0026 | ª 00AA | « 00AB | ¬ 00AC | SHY 00AD | ® 00AE | ¯ 00AF | ° 00B0 | ± 00B1 | ² 00B2 | ! 0021 | $ 0024 | * 002A | ) 0029 | ; 003B | ^ 005E |
| 6... | - 002D | / 002F | ³ 00B3 | ´ 00B4 | µ 00B5 | ¶ 00B6 | · 00B7 | ¸ 00B8 | ¹ 00B9 | º 00BA | » 00BB | , 002C | % 0025 | _ 005F | > 003E | ? 003F |
| 7... | ¼ 00BC | ½ 00BD | ¾ 00BE | ¿ 00BF | À 00C0 | Á 00C1 | Â 00C2 | Ã 00C3 | Ä 00C4 | ` 0060 | : 003A | # 0023 | @ 0040 | ' 0027 | = 003D | " 0022 |
| 8... | Å 00C5 | a 0061 | b 0062 | c 0063 | d 0064 | e 0065 | f 0066 | g 0067 | h 0068 | i 0069 | Æ 00C6 | Ç 00C7 | È 00C8 | É 00C9 | Ê 00CA | Ë 00CB |
| 9... | Ì 00CC | j 006A | k 006B | l 006C | m 006D | n 006E | o 006F | p 0070 | q 0071 | r 0072 | Í 00CD | Î 00CE | Ï 00CF | Ð 00D0 | Ñ 00D1 | Ò 00D2 |
| A... | Ó 00D3 | ~ 007E | s 0073 | t 0074 | u 0075 | v 0076 | w 0077 | x 0078 | y 0079 | z 007A | Ô 00D4 | Õ 00D5 | Ö 00D6 | [ 005B | × 00D7 | Ø 00D8 |
| B... | Ù 00D9 | Ú 00DA | Û 00DB | Ü 00DC | Ý 00DD | Þ 00DE | ß 00DF | à 00E0 | á 00E1 | â 00E2 | ã 00E3 | ä 00E4 | å 00E5 | ] 005D | æ 00E6 | ç 00E7 |
| C... | { 007B | A 0041 | B 0042 | C 0043 | D 0044 | E 0045 | F 0046 | G 0047 | H 0048 | I 0049 | è 00E8 | é 00E9 | ê 00EA | ë 00EB | ì 00EC | í 00ED |
| D... | } 007D | J 004A | K 004B | L 004C | M 004D | N 004E | O 004F | P 0050 | Q 0051 | R 0052 | î 00EE | ï 00EF | ð 00F0 | ñ 00F1 | ò 00F2 | ó 00F3 |
| E... | \ 005C | ô 00F4 | S 0053 | T 0054 | U 0055 | V 0056 | W 0057 | X 0058 | Y 0059 | Z 005A | õ 00F5 | ö 00F6 | ÷ 00F7 | ø 00F8 | ù 00F9 | ú 00FA |
| F... | 0 0030 | 1 0031 | 2 0032 | 3 0033 | 4 0034 | 5 0035 | 6 0036 | 7 0037 | 8 0038 | 9 0039 | û 00FB | ü 00FC | ý 00FD | þ 00FE | ÿ 00FF | APC 009F |
| Notes : Les caractères de contrôle de l’EBCDIC sont indiqués sur fond rouge (commandes C0) ou mauve (commandes C1). Les positions invariantes de l’ISO 646 ou de l’ISO 8859 sont généralement invariantes dans les versions de l’EBCDIC. Elles sont indiquées en fond blanc. Les positions variantes de l’EBCDIC indiquent en italique le point de code Unicode correspondant uniquement à cette variante : Les caractères variants des différentes versions correspondantes de l’ISO 646 sont affichés sur fond jaune (le caractère affiché est celui de l’EBCDIC CCSID 500 ou de l’ASCII). Le caractère “double quote” U+0022 (codé 0x7F dans la plupart des variantes de l’EBCDIC) n’est pas variant dans les jeux de caractères compatibles ISO 646, mais varie dans la version turque de l’EBCDIC. Les minuscules latines U+0061 à U+007A (codées 0x81..0x89, 0x91..0x99, 0xA2..0xA9 dans la plupart des variantes de l’EBCDIC) ne sont pas variants dans les jeux de caractères compatibles ISO 646, mais varient dans les versions japonaises (hiragana/katakana) et cyrilliques de l’EBCDIC (qui y codent d’autres lettres nécessaires à ces écritures). Les caractères variants des différentes versions étendues de l’EBCDIC sont affichés sur fond vert (le caractère affiché est celui de l’UTF-EBCDIC interprété comme caractère l’ISO/CEI 8859-1). Certains caractères étaient différents dans la version initiale de l’EBCDIC qui y plaçait des symboles spéciaux. Les variantes CCSID 037 et 500 les plus connues de l’EBCDIC y utilisent ainsi une assignation différente pour de tels symboles. |||||||||||||||||

## Transcodage de l’ISO 8859-1 vers l’EBCDIC

La table suivante permet de transcoder l’ASCII (caractères Unicode U+0000 à U+007F) et le jeu de commandes C1 (caractères Unicode U+0080 à U+009F) en EBCDIC. Les caractères de l’extension ISO 8859 (en vert) sont indiqués ici dans l’ordre compatible avec l’UTF-EBCDIC, mais cette assignation ne correspond pas à une variante nationale particulière de l’EBCDIC.
Cette table est l’inverse de la table précédente et est compatible octet par octet avec la seconde phase (de permutation des valeurs d’octets) de l’UTF-EBCDIC.
Ensemble, ces deux tables permettent d’adapter facilement n’importe quel jeu de caractère compatible ISO 646 ou ISO 8859 pour des traitements sur des systèmes EBCDIC standards. Par contre, pour adapter à une version précise d’un jeu EBCDIC (et faire reconnaître exactement les caractères non ASCII), il faudra substituer les positions marquées en vert dans les deux tables, en fonction de leur assignation réelle dans les variantes nationales de jeux EBCDIC correspondants, voire substituer les lettres minuscules latines remplacées dans certaines versions obsolètes de certains jeux EBCDIC (jeu EBCDIC japonais ou cyrillique, sauf les jeux EBCDIC russes qui unifient avec le même code EBCDIC certaines lettres cyrilliques et latines comme le A, d’apparences identiques dans les deux écritures).
Le détail des assignations de ces positions (marquées ici en vert dans les deux tables) dans les variantes nationales de l’EBCDIC est référencé sur le site IBM mentionné dans les liens externes. Notamment, la variante encore la plus utilisée est l’EBCDIC CCSID 500 (version internationale du jeu Latin n$^o$ 1 dont le jeu est très proche de celui de l’ISO 8859-1, mais avec quelques différences, et triée différemment des tables présentées ici).
Transcodage de l’ISO-8859-1 vers EBCDIC (variante compatible avec l’UTF-EBCDIC). :
| Colonne Unicode | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) | Quartet bas Unicode (toutes les valeurs sont en hexadécimal) |
| Colonne Unicode | ...0 | ...1 | ...2 | ...3 | ...4 | ...5 | ...6 | ...7 | ...8 | ...9 | ...A | ...B | ...C | ...D | ...E | ...F |
| 000... | NUL 00 | SOH 01 | STX 02 | ETX 03 | EOT 37 | ENQ 2D | ACK 2E | BEL 2F | BS 16 | HT 05 | LF 15 | VT 0B | FF 0C | CR 0D | SO 0E | SI 0F |
| 001... | DLE 10 | DC1 11 | DC2 12 | DC3 13 | DC4 3C | NAK 3D | SYN 32 | ETB 26 | CAN 18 | EM 19 | SUB 3F | ESC 27 | FS 1C | GS 1D | RS 1E | US 1F |
| 002... | SP 40 | ! 5A | " 7F | # 7B | $ 5B | % 6C | & 50 | ' 7D | ( 4D | ) 5D | * 5C | + 4E | , 6B | - 60 | . 4B | / 61 |
| 003... | 0 F0 | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | 6 F6 | 7 F7 | 8 F8 | 9 F9 | : 7A | ; 5E | < 4C | = 7E | > 6E | ? 6F |
| 004... | @ 7C | A C1 | B C2 | C C3 | D C4 | E C5 | F C6 | G C7 | H C8 | I C9 | J D1 | K D2 | L D3 | M D4 | N D5 | O D6 |
| 005... | P D7 | Q D8 | R D9 | S E2 | T E3 | U E4 | V E5 | W E6 | X E7 | Y E8 | Z E9 | [ AD | \ E0 | ] BD | ^ 5F | _ 6D |
| 006... | ` 79 | a 81 | b 82 | c 83 | d 84 | e 85 | f 86 | g 87 | h 88 | i 89 | j 91 | k 92 | l 93 | m 94 | n 95 | o 96 |
| 007... | p 97 | q 98 | r 99 | s A2 | t A3 | u A4 | v A5 | w A6 | x A7 | y A8 | z A9 | { C0 | | 4F | } D0 | ~ A1 | DEL 07 |
| 008... | PAD 20 | HOP 21 | BPH 22 | NBH 23 | IND 24 | NEL 25 | SSA 06 | ESA 17 | HTS 28 | HTJ 29 | VTS 2A | PLD 2B | PLU 2C | RI 09 | SS2 0A | SS3 1B |
| 009... | DCS 30 | PU1 31 | PU2 1A | STS 33 | CCH 34 | MW 35 | SPA 36 | EPA 08 | SOS 38 | SGCI 39 | SCI 3A | CSI 3B | ST 04 | OSC 14 | PM 3E | APC FF |
| 00A... | NBSP 41 | ¡ 42 | ¢ 43 | £ 44 | ¤ 45 | ¥ 46 | ¦ 47 | § 48 | ¨ 49 | © 4A | ª 51 | « 52 | ¬ 53 | SHY 54 | ® 55 | ¯ 56 |
| 00B... | ° 57 | ± 58 | ² 59 | ³ 62 | ´ 63 | µ 64 | ¶ 65 | · 66 | ¸ 67 | ¹ 68 | º 69 | » 6A | ¼ 70 | ½ 71 | ¾ 72 | ¿ 73 |
| 00C... | À 74 | Á 75 | Â 76 | Ã 77 | Ä 78 | Å 80 | Æ 8A | Ç 8B | È 8C | É 8D | Ê 8E | Ë 8F | Ì 90 | Í 9A | Î 9B | Ï 9C |
| 00D... | Ð 9D | Ñ 9E | Ò 9F | Ó A0 | Ô AA | Õ AB | Ö AC | × AE | Ø AF | Ù B0 | Ú B1 | Û B2 | Ü B3 | Ý B4 | Þ B5 | ß B6 |
| 00E... | à B7 | á B8 | â B9 | ã BA | ä BB | å BC | æ BE | ç BF | è CA | é CB | ê CC | ë CD | ì CE | í CF | î DA | ï DB |
| 00F... | ð DC | ñ DD | ò DE | ó DF | ô E1 | õ EA | ö EB | ÷ EC | ø ED | ù EE | ú EF | û FA | ü FB | ý FC | þ FD | ÿ FE |
| Notes : Les positions variantes de l’EBCDIC indiquent en italique le code EBCDIC correspondant uniquement à cette variante ; Les caractères de contrôle de l’EBCDIC sont indiqués sur fond rouge (commandes C0) ou mauve (commandes C1). Les caractères variants des différentes versions correspondantes de l’ISO 646 sont affichés sur fond jaune (le caractère affiché est celui de l’EBCDIC CCSID 500 ou de l’ASCII). Le caractère “double quote” U+0022 (codé 0x7F dans la plupart des variantes de l’EBCDIC) n’est pas variant dans les jeux de caractères compatibles ISO 646, mais varie dans la version turque de l’EBCDIC. Les minuscules latines U+0061 à U+007A (codées 0x81..0x89,0x91..0x99,0xA2..0xA9 dans la plupart des variantes de l’EBCDIC) ne sont pas variants dans les jeux de caractères compatibles ISO 646, mais varient dans les versions japonaises et cyrilliques de l’EBCDIC. Les caractères variants des différentes versions étendues de l’EBCDIC sont affichés sur fond vert (le caractère affiché est celui de l’UTF-EBCDIC interprété comme caractère l’ISO/CEI 8859-1). Certains caractères étaient différents dans la version initiale de l’EBCDIC qui y plaçait des symboles spéciaux. Les variantes CCSID 037 et 500 les plus connues de l’EBCDIC utilisent une assignation différente. |||||||||||||||||