Aller au contenu

Extended Binary Coded Decimal Interchange Code

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis EBCDIC)

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.

Une carte perforée 80 colonnes d'IBM d'un des types les plus utilisés au XXe siècle. La photographie fait apparaître le jeu de caractère EBCDIC de 1964, qui ajoutait de nouveaux caractères aux caractères précédents.

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

[modifier | modifier le code]

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)
...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

[modifier | modifier le code]

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 no 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)
...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.

Articles connexes

[modifier | modifier le code]

Liens externes

[modifier | modifier le code]