Les trigraphes et les digraphes

Introduction

Certains jeux de caractères ne contiennent pas tous les caractères nécessaires pour écrire le C. En particulier, les variantes nationales d'ISO 646 peuvent remplacer les caractères #, [, \, ], ^, {, |, }, ~ par d'autres (il y a encore quelques autres caractères qui peuvent être remplacés, mais ils ne sont pas nécessaires pour écrire du C).

La meilleure solution au problème posé par l'absence de ces caractères est l'utilisation de charsets ayant tous les caractères désirés, par exemple ceux de la norme ISO 8859. Mais le C a quand même trois mécanismes, les trigraphes, les digraphes et l'entête <iso646.h> pour traiter les problèmes d'écriture du C avec certains charsets.

Un autre problème qui est résolu par les trigraphes est que les mainframes IBM supportent plusieurs charsets, variantes de l'EBCDIC. La plupart des caractères nécessaires au C ont le même codets dans toutes ces variantes, mais pas tous. En particulier # se trouve a au moins 8 codets différents suivant la variante d'EBCDIC considérées, et ! a lui au moins 3 codets différents. Dans ces implémentations, on utilise les trigraphes pour coder dans le sous-ensemble commun (en caractères et en codets) de tous les charsets supportés, au moins jusqu'à utiliser un #pragma permettant d'indiquer le charset effectivement utilisé.

Trigraphes

Le C90 a introduit les trigraphes pour permetre l'écriture du C avec dans n'importe quelle variante nationales sans utiliser ces caractères. Les suites de trois caractères suivantes désignent les caractères remplaçables, dans tous les contextes (y compris les chaînes de caractères):

??=#??([??/\
??)]??'^??<{
??!|??>}??-~

Digraphes

Les trigraphes ne sont pas estétiquement très réussis. Et le fait qu'ils soient remplacés dans tous les contextes peuvent les rendre surprenants. Les digraphes ont été introduits en C95 avec le même objectif, mais ce sont des orthographes alternatives aux symboles (donc ils ne sont pas actifs dans les chaînes de caractères):

<:[<%{%:#
:>]%>}%:%:##

Les autres caractères manquant ont des macros qui permettent d'éviter leur utilisation. Ces macros sont définies dans l'entête <iso646.h>.

Le seul caractère ayant une signification en C et qui n'est pas traité par ce qui a été introduit en C95 est \. Si une alternative est désirable, il faut utiliser le trigraphe ??/ ou quelque chose fournit par l'implémentation (par exemple, l'utilisation du caractère de même codet que \ dans le charset utilisé).


Copyright © 2008 -- 2009 Jean-Marc Bourguet Accueil Pages sur le C