Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

MFC et accents


Sujet :

MFC

  1. #1
    Candidat au Club
    MFC et accents
    Bonjour,

    Je reprends un vieux programme dans lequel il y avait

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     sprintf_s(str, "Lignes tracées : %d   Coups possibles :%d", m_iOrdre, iNombre);
     CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
     CStatusBar *pStatus = &pFrame->m_wndStatusBar;
     pStatus->SetPaneText(0, str);


    qui fonctionnait très bien , mais qui ne passe plus la compilation à cause de la dernière ligne (str est un char *)

    j'en suis arrivé à

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	str.Format(L"Lignes tracées : %d   Coups possibles :%d ", m_iOrdre, iNombre);
    	CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
    	CStatusBar *pStatus = &pFrame->m_wndStatusBar;
    	pStatus->SetPaneText(0, str);


    où str est une CString, cela fonctionne mais à la place du é j'obtiens é

    Je développe aujourd'hui avec visual studio 2017 sous Windows 10

    Comment régler ce problème simplement (- de 10 à corriger), dans le pire des cas je trouve une périphrase sans accent

    Merci d'avance

  2. #2
    Expert éminent sénior
    Déjà, perso j'utiliserais _T("texte") plutôt que L"texte" à moins d'utiliser explicitement une CStringW. Ensuite, j'ai du mal à comprendre comment tu te retrouves avec de l'UTF-8 ici, alors que Windows tend à tourner en Windows-1252...
    Ça peut être une histoire d'encodage de ton fichier source (normalement ça peut se vérifier quelque part dans Visual, ou même avec notepad) mais si c'est bien ça la cause alors c'est bien mal fait.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    qui fonctionnait très bien , mais qui ne passe plus la compilation à cause de la dernière ligne (str est un char *)
    Ça, ça m'étonnerait beaucoup.
    https://docs.microsoft.com/fr-fr/cpp/c-runtime-library/reference/sprintf-s-sprintf-s-l-swprintf-s-swprintf-s-l?view=vs-2019
    A moi de baser par des MACRO bien dégueu pour passer outre des alarmes de sécurité, comme un gros cochon.
    L'ajout du "_s" change un peu tout à l'histoire.

    J'approuve toutes les remarques de ce cher @Médinoc et j'ajoute que comme on a aucune information sur les #define UNICODE, MBCS et autres réglages des options du projet, en fin de compte, on peut tomber sur une combinaison qui fait apparaitre de l'UTF-8.

    Il faut être rigoureux (usage de _T ou de L, c'est pas pareil, avoir un encodage des fichiers sources cohérents avec les options du projet, etc...), et des valeurs en dur dans le code, c'est vraiment chercher les emmerdes, surtout avec tous les mécanismes intégrés au MFC pour faciliter la localisation des applications.
    Morale : en travaillant comme un cochon, on n'a un résultat de cochon.

  4. #4
    Candidat au Club
    Citation Envoyé par bacelar Voir le message
    Ça, ça m'étonnerait beaucoup.
    Et pourtant si. L'erreur n'était pas sur le sprintf mais sur le SetPaneText


    Citation Envoyé par bacelar Voir le message
    Morale : en travaillant comme un cochon, on n'a un résultat de cochon.
    Merci de votre aide qui ne sert à rien

  5. #5
    Candidat au Club
    Citation Envoyé par Médinoc Voir le message
    Déjà, perso j'utiliserais _T("texte") plutôt que L"texte"
    Merci de votre réponse mais le résultat est le même.

  6. #6
    Candidat au Club
    Résolu (ou presque) :

    En ajoutant /utf-8 dans la ligne de commande, cela marche.

    Si ce n'est pas abuser, avec cet ajout j'ai des warning :

    resource.h : warning C4828: Le fichier contient un caractère qui débute à l'offset 0x4a et qui est non conforme dans le jeu de caractères source actuel (page de codes 65001).

    resource.h étant un fichier généré par VS

  7. #7
    Candidat au Club
    Ce dernier problème est dû à un accent dans un commentaire de resource.h, je l'ai viré et bien que pas complètement satisfaisant, le problème est résolu.

  8. #8
    Expert éminent sénior
    Cela veut aussi dire que votre IDE n'est toujours pas correctement configuré.

    Assainissez vos méthodes de travail, pas de valeur en dur, supprimer ces MACRO à la con de contournement des outils de qualité logicielle, etc...

    Je le répète, arrêtez de travailler comme un cochon.

  9. #9
    Candidat au Club
    Une fois de plus arrêter de parler sans savoir : quelles macro j'ai installées, quelles valeurs en dur j'ai déclarées, bref, cessé de polluer ce fil avec des remarques inutiles et sans intérêt.

  10. #10
    Expert éminent sénior
    quelles macro j'ai installées
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    sprintf_s(str, "Lignes tracées : %d   Coups possibles :%d", m_iOrdre, iNombre);

    Si ceci compile, il y a une MACRO qui "triche".

    quelles valeurs en dur j'ai déclarées
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    str.Format(L"Lignes tracées : %d   Coups possibles :%d ", m_iOrdre, iNombre);

    Ceci EST une valeur en dur.

  11. #11
    Candidat au Club
    Au moins vous m'aurez fait rire

  12. #12
    Expert éminent sénior
    Pourquoi utiliser sprintf_s ? C'est une instruction pour les chaînes ANSI
    Il faut utiliser wsprintf_s plutôt
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    ( A Einstein)

  13. #13
    Candidat au Club
    Citation Envoyé par Mat.M Voir le message
    Pourquoi utiliser sprintf_s ? C'est une instruction pour les chaînes ANSI
    Il faut utiliser wsprintf_s plutôt
    Bonjour,

    Merci, mais le sprintf_s est dans la vieille version qui marchait parfaitement et compilait (avec les outils de l'époque (?)) sans problème quoi que puisse en penser certain.

    En tout état de cause maintenant cela marche

###raw>template_hook.ano_emploi###