- La console est en UTF-8. - Tu utilises g++, il me semble que sans précision, les chaines "" sont en UTF-8 dans le code. - Tu ne précises pas l'encodage utilisé dans tes fichiers sources, pour simplifier il est préférable qu'ils soient aussi en UTF-8. - Le problème c'est ton fichiers des réponses, il serait en autre chose que de l'UTF-8. Sous Windows les fichiers textes utilisent plutôt la page de code Windows-1252.
Le plus simple est de convertir ton fichier des réponses en UTF-8. Après conversion de 1252 vers UTF-8, tout sera UTF-8 et tes problèmes devraient disparaître.
C'est moins évident que ça. Sur mon ordi, je suis en 850 au départ (je fais chcp sans paramêtre) Si je génère un fichier avec notepad et que je passe en utf-8 (chcp 65001), je n'ai pas de problème. Même chose avec un chcp 1252. Mais si j'utilise l'explorateur de fichier et que je crée un fichier avec Wordpad, là j'ai des problèmes. Il faut donc créer le source du programme et le fichier des réponses avec le même éditeur. Je ne suis pas certain mais je pense que Wordpad crée du latin-1 Et j'ai toujours utilisé notepad pour générer mes sources en C (ou autres ...)
edit: Si vous voulez faire des tests plus poussés sur cmd. Wordpad s'appelle write.exe Block-Notes s'appelle notepad.exe (le .exe n'est pas rrequis dans cmd)
- Edité par PierrotLeFou 5 août 2022 à 1:47:32
Le Tout est souvent plus grand que la somme de ses parties.
j'ai uttilisé Sublime Text 3 pour programmer mon application et aussi pour écrire les fichiers de questions et de réponses qui j'ai enregistré en UTF-8 mais cela na hélas pas marché alors j'ai reformé mon programe pour qu'il m'affiche la valeur ASCII de chaque lettre de la réponse donné et de la réponse voulue et en effet j'ai eu une surprise .
Sur un mot qui ne comportait pas d'accent la valeur ASCII de chaque lettre était la même .Jusqu'a la rien de surprenant mais sur un mot qui comportait un accent j'ai eu de un, pas le même nombre de lettre mais aussi des valeurs negatives .
Réponse donné : 100;97;114;114;105;0;114
Réponse attendue : 100;97;114;114;105;-61;-88;114
L'accent se trouvant à la sixième lettre (aprés 105 et la où il y a la valeur 0)
Si je comprend bien c'est bien un problème d'encodage .Que doit-je faire ? J'ai enregistré met fichier sur sublime texte par Save with encoding > -8
et oui, les deux entiers -61, -88 forment une séquence UTF-8 (ce qui est probablement directement dans ton code ou lu depuis ton fichier). Visiblement le getline fait quelque chose d'étrange.
git is great because Linus did it, mercurial is better because he didn't.
Alors, je me trouve toujours sur Windows 10 sous cmd. Je suis en utf-8 (chcp 65001) Je crée un fichier "aa.txt" qui contient essentiellement élève J'ai écrit le petit programme suivant que j'ai appelé "aa" (pas très original, je sais ...) - #include <iostream> #include <fstream> #include <string> int main(void) { std::string name {"aa.txt" }; std::ifstream file { name}; std::string line; getline(file, line); for(auto c: line) { int n = c; std::cout << n << " "; } std::cout << std::endl; std::string text; std::cin >> text; for(auto c: text) { int n = c; std::cout << n << " "; } std::cout << std::endl; } - Si je fais: type aa.txt | aa j'obtiens: -61 -87 108 -61 -88 118 101 -61 -87 108 -61 -88 118 101 Si je fais: aa et que je tape élève j'obtiens: -61 -87 108 -61 -88 118 101 élève 0 108 0 118 101 Si j'utilise mon petit programme de dump sur le fichier aa.txt, j'obttiens: *** Fichier 'aa.txt' Longueur: 7 octets 0 ??l??ve C3 A9 6C C3 A8 76 65
edit: Si je fais: echo élève>ab.txt Et que je repasse mon programme: *** Fichier 'ab.txt' Longueur: 9 octets 0 ??l??ve?? C3 A9 6C C3 A8 76 65 0D 0A
-
J'ai fait des tests semblables en C avec fgets et scanf et j'obtiens le même résultat.
On dirait que le coupable est cmd lui-même.
Pourquoi est-ce différent avec le echo ou taper en direct?
Et si j'essaie en Python: print(*[hex(ord(c))[2:] for c in input()]) j'obtiens: e9 6c e8 76 65
sans echo
c3 a9 6c c3 a8 76 65 avec le echo
- Edité par PierrotLeFou 6 août 2022 à 4:37:47
Le Tout est souvent plus grand que la somme de ses parties.
Donc si je comprend bien la solution c'est d'uttiliser Linux .J'avais déjà coder le même programme sous Debian et je n'avais eu aucun soucis. Je me dit que si je voulais rester sous Windows je devrais coder une interface graphique, a mon avis il y aurait plus de problème .J'ai apris quelque truc sur les encodages sous windows .Merci beaucoup de m'avoir aidé .
(L'encodage du fichier source n'a d'importance que pour les chaînes de caractère qui y sont écrite en dur).
EDIT : Un code avec un fichier utf8 :
#include <stdio.h>
#include <wchar.h>
#include <windows.h>
int main(void)
{
SetConsoleOutputCP(1252);
FILE *fd = fopen("fileutf8.txt", "r");
fscanf(fd, "%*3s"); // suppression des 3 octets de début de fichier utf8
char fichier[32];
fscanf(fd, "%31s", fichier);
fclose(fd);
WCHAR sortie[256];
int len = MultiByteToWideChar(CP_UTF8, 0, fichier, -1, NULL, 0);
MultiByteToWideChar(CP_UTF8, 0, fichier, -1, sortie, len);
printf("Lu et converti : %ls\n", sortie);
char saisie[256];
scanf("%31s", saisie);
WCHAR saisiew[256];
OemToCharW(saisie, saisiew);
printf("Saisie et converti : %ls\n", saisiew);
if(wcsncmp(sortie, saisiew, wcslen(sortie))==0) puts("Sont identiques");
else puts("Ne sont pas identiques");
return 0;
}
- Edité par rouIoude 6 août 2022 à 23:05:34
...
Mingw problème avec les accents
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.
Le Tout est souvent plus grand que la somme de ses parties.
git is great because Linus did it, mercurial is better because he didn't.
git is great because Linus did it, mercurial is better because he didn't.
Le Tout est souvent plus grand que la somme de ses parties.