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é.
??= | # | ??( | [ | ??/ | \ |
??) | ] | ??' | ^ | ??< | { |
??! | | | ??> | } | ??- | ~ |
<: | [ | <% | { | %: | # |
:> | ] | %> | } | %:%: | ## |
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é).