Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mingw problème avec les accents

Sujet résolu
    4 août 2022 à 18:31:25

    Bonjour, voilà je cherche a programmer un quiz inter-langue (en gros je dit un mot dans une langue et j'attend ça traduction dans une autre langue)

    Dans mon code je cherche une égalité entre la réponse et la traduction attendue de cette manière

    if (!anwser.compare(good_anwsers[index])) {

    Sauf que quand la réponse contient un accent il me dit que c'est faux

    Je précise que j'utilise le cmd de Windows que j'ai mit en UTF-8 donc il m'affiche bien les accents et pour compile j'utilise g++ avec cette commande

    g++ main.cpp -Wall -o main.exe

    J'ai impression que std::cin() n'interprète pas les accents donc quand il le compare avec la réponse attendue, que je récupère d'un fichier .txt par 

    getline(anwser_file, good_anwser);

    la lettre accentué na pas la même valeur a cause d'un encodage différent .Mais cela me semble farfelu .Qu'en pensez-vous ?



    • Partager sur Facebook
    • Partager sur Twitter
      4 août 2022 à 23:42:12

      Bonjour,

      - 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.

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        5 août 2022 à 1:27:48

        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

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          5 août 2022 à 7:50:54

          Affiche tous les octets de chaque chaine à comparer lorsque tu fais la comparaison (en castant vers int) et tu auras peut-être une suprise.
          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            5 août 2022 à 19:47:46

            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

            -
            Edité par Breèis_ 5 août 2022 à 20:55:24

            • Partager sur Facebook
            • Partager sur Twitter
              5 août 2022 à 20:50:03

              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.
              • Partager sur Facebook
              • Partager sur Twitter

              git is great because Linus did it, mercurial is better because he didn't.

                6 août 2022 à 2:17:49

                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

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  6 août 2022 à 13:23:48

                  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é .
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 août 2022 à 18:59:49

                    La console windows ne gère pas très bien l'UTF8. (notamment les saisies clavier).

                    J'ai pu faire fonctionner ton problème avec un fichier ANSI.

                    (code en C).

                    #include <stdio.h>
                    #include <string.h>
                    #include <windows.h>
                    
                    int main(void)
                    {
                        SetConsoleOutputCP(1252);
                        FILE *fd = fopen("fileansi.txt", "r");
                    
                        char fichier[32];
                        fscanf(fd, "%31s", fichier);
                        puts(fichier);
                    
                        char saisie[32];
                        scanf("%31s", saisie);
                        OemToChar(saisie, saisie);
                        puts(saisie);
                    
                        if(strcmp(fichier, saisie)==0) puts("Sont identiques");
                        else puts("Ne sont pas identiques");
                    
                        fclose(fd);
                        return 0;
                    }

                    (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

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Mingw problème avec les accents

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    • Editeur
                    • Markdown