Bonjour, je voulais savoir si il était possible dans un printf de mettre des caractères accentués sans qu'il change lors de l'éxecution (sous Windows par exemple avec CODE::BLOCKS) et si oui comment.
Merci d'avance de m'aider !
Version imprimable
Bonjour, je voulais savoir si il était possible dans un printf de mettre des caractères accentués sans qu'il change lors de l'éxecution (sous Windows par exemple avec CODE::BLOCKS) et si oui comment.
Merci d'avance de m'aider !
C'est un peu dur à répondre à ça parce-que de tous les corrigés des exercices en ligne je n'ai jamais vu un programme en C accepter les caractères accentués.
Pourtant rien ne l’empêche ;) ;)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include<stdio.h> int main (int argc, char** argv) { unsigned char chinese_char[] = {0x20, 0xE5, 0xA4, 0xA7, 0xE5, 0xAE, 0xB6, 0x2C, 0x20, 0xE8, 0xB0, 0xA2, 0xE8, 0xB0, 0xA2, 0x21, 0x00}; unsigned char russian_char[] = {0xD0, 0xA0, 0xD1, 0x83, 0xD1, 0x81, 0xD1, 0x81, 0xD0, 0xBA, 0xD0, 0xB0, 0xD1, 0x8F, 0x20, 0x41, 0x5A, 0x45, 0x52, 0x54, 0x59, 0x20, 0xD0, 0xBA, 0xD0, 0xBB, 0xD0, 0xB0, 0xD0, 0xB2, 0xD0, 0xB8, 0xD0, 0xB0, 0xD1, 0x82, 0xD1, 0x83, 0xD1, 0x80, 0xD0, 0xB0, 0x00}; printf("%s\n\n%s\n\n", chinese_char, russian_char); printf("Vous avez pass\u00E9 en tout %d param\u00E8tres sur la ligne de commande.\n", argc); return 0; }
Sous Windows, dans la console, il faut utiliser la commande chcp 65001 (change code page) ... mais certains caractères passent quand même pas
Pour manipuler des caractères accentués (et plus généralement tous les glyphes non ASCII 7 bits), il faut que tous les éléments de la chaîne de compilation et d'exécution en soient capable.
Il faut :
- Que le langage sache manipuler ces caractères
C/C++ sait les manipuler avec char (ASCII, ISO-8859, UTF-8) et wchar_t (UTF-16 et UTF-32).- Que le code source puisse les contenir
Il y a plusieurs syntaxes. Par exemple puts("\302\253"); est équivalent à puts("«"); si le code source est encodé en ASCII.- Que le terminal soit capable de les afficher
C'est là que ça bloque sur Windows. En effet le terminal affiche par défaut uniquement les 256 caractères de l'encodage ISO-8859.
Pour que Windows puisse afficher des caractère spéciaux, il faut donc changer l'encodage du terminal comme l'indique foetus, mais aussi utiliser une police d'affichage qui contient les glyphes voulus (sinon on a un � qui le remplace).
Une première à chose à faire est de s'assurer que le code source est sauvegardé en UTF8 par exemple pour prendre en compte les caractères accentués.
Même si je me bats avec les IDEs (Visual et C++ Builder) pour sauvegarder tous mes fichiers en UTF-8, je ne suis pas trop d'accord :mrgreen:
Si tu échappes tous les caractères (comme dans mon bout de code), il te reste que de l'ASCII ... sauf si tu ne commentes pas en anglais
Non rien de spécial: regarde mon code avec des UTF-8 code units :mrgreen:
L'UTF-8 c'est juste une succession d'octets: regarde la page wiki
D'accord merci mais pourriez vous montrer un petit bout de code avec des caractères accentués parce que le premier je ne l'ai pas trop compris (je suis pas très loin du niveau débutant) si il vous étiez possible de me l'expliquer avec un petit bout de code ce serait génial et merci de vos précédente réponse !
Code:
1
2
3
4
5
6
7
8
9
10
11 #include <stdio.h> #include <stdlib.h> int main() { printf("*Salut je m'appel Andr%c je travail sur le tri %c bulle %c version 01\n ",130,133,184); printf("c'est la 1%cre fois\n ",138); return 0; }
Avez-vous essayé avec wprintf() et des chaînes "larges"?
Non, a vrais dire je ne sais même pas ce qu'est wprintf Mais je vais aller jeter un coup d'oeil , merci beaucoup ! :)
Bonjour,
l'interpréteur de commande Windows supporte parfaitement les caractères accentués, il suffit d'encoder la chaîne avec bon encodage. Pour les systèmes en français (France), c'est CP-850 (aussi appelé OEM-850). D'une manière générale, il est possible de trouvé l'encodage par défaut pour l'interpréteur dans le registre sous la clé "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage" dans la valeur "OEMCP" de type REG-SZ (pour l'encodage ANSI par défaut pour les APIs, c'est la valeur "ACP").
Code::Block ne supporte pas cet encodage (il me semble, de mémoire) mais il suffit d'éditer le fichier source dans un éditeur qui le supporte (comme notepad++), puis tu modifie la chaine en question, tu enregistre ton fichier et enfin tu le compile de nouveau avec Code::Block. Et magie, magie, ..., ça marche.
Après vérification, Code::Blocks ne supporte effectivement pas CP-850 mais il supporte d'autres Code Page spécifique à l'interpréteur et donc peut être modifier dans ce sens. Personnellement, je n'ai pas les compétence pour le faire mais si quelqu'un qui lit ce message peut le faire, je suis preneur.