Comment définir les caractères d’exécution en C?

Comment définir les caractères d’exécution définis dans le langage de programmation C, dans l’environnement Linux?

Par exemple, je souhaite le définir sur iso8859-1, utf-8 ou ascii.

Ce que printf( "%c", '\xa3') fait est toujours identique – il envoie un octet avec la valeur 0xA3 (= 163) dans le stream de sortie standard.

Ce qui est ensuite affiché sur votre écran dépend de la façon dont votre terminal (par exemple, xterm ou la console Linux) réagit en voyant un octet avec la valeur 163 écrite. Il s’agit de la définition des caractères de votre terminal et il n’ya aucune influence directe de votre programme C sur celui-ci. Ce que vous devez faire est de permettre au programme C de déterminer le jeu de caractères attendu par le terminal, puis de générer une sortie correspondant à celle-ci.

Les programmes simples peuvent souvent s’en tirer en supposant que le jeu de caractères dans lequel ils entrent est également le jeu de caractères dans lequel leur sortie devrait être, puis ils ignorent simplement les problèmes de jeu de caractères et reproduisent simplement les octets de poids fort dans leur sortie exactement tels qu’ils sont apparus l’entrée. (Le codage UTF-8 de Unicode est délibérément conçu pour que cette stratégie fonctionne dans de nombreux cas).

Toutefois, lorsque ce n’est pas le cas – par exemple si votre programme contient une chaîne codée en dur avec des lettres non anglaises – vous devez utiliser les fonctions de parameters régionaux pour déterminer le codage de caractères que votre programme est censé produire, puis assurez-vous de fais ça. Des bibliothèques telles que libiconv peuvent souvent y consortingbuer relativement sans douleur.

Vous devez être un peu plus précis sur ce que vous voulez dire. Pour la plupart, C n’a pas vraiment de jeu de caractères; ses chaînes sont simplement des chaînes d’octets délimitées par des valeurs nulles et ne font rien pour les encoder ou les décoder.

Il existe quelques fonctions dans la bibliothèque standard C et dans POSIX qui dépendent des parameters régionaux actuels. Vous pouvez utiliser setlocale pour définir les parameters régionaux actuels. Il utilise par défaut les parameters régionaux C, dans lesquels les chaînes sont traitées en tant qu’ASCII et comparées selon les valeurs d’octet.

Si vous souhaitez convertir des jeux de caractères, utilisez iconv ; Cela vous permettra de convertir les tampons d’un encodage à un autre. Par exemple, si vous représentez votre texte en interne dans UTF-8, mais souhaitez l’imprimer dans ISO-8859-1, c’est ce que vous utiliseriez.

modifier pour append : À partir d’un commentaire sur une autre réponse, vous demandez:

Je règle le jeu de caractères attendu de mon terminal sur “ISO 8859-1”, mais pourquoi quand j’appelle la fonction setlocale( LC_CTYPE, NULL ); , il retourne toujours C ? Je pense qu’il devrait renvoyer ISO 8859-1 car il s’agit du jeu de caractères attendu du terminal.

Lorsque le programme démarre, ses parameters régionaux sont toujours “C”. Si vous souhaitez définir les parameters régionaux en fonction des variables d’environnement, vous devez appeler setlocale( LC_ALL, "") ou setlocal( LC_CTYPE, "") ; c’est-à-dire que vous devez passer une chaîne vide, puis les parameters régionaux seront définis en fonction de vos variables d’environnement.

Voir setlocale(3) , qui définit les parameters régionaux actuels du programme.

Le standard C fournit la fonction setlocale() pour définir des parameters régionaux. La valeur de LC_CTYPE définit le type de caractère. Pour plus de détails, voyez aussi ce que POSIX a à dire. Pour connaître les parameters régionaux pris en charge sur votre système, exécutez

 locale -a