Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu] Problème accents  (Lu 5978 fois)

0 Membres et 1 Invité sur ce sujet

valentin_616

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
[Résolu] Problème accents
« le: Août 29, 2016, 09:19:48 pm »
Bonjour tout le monde.
J'ai besoin d'aide car je n'arrive pas à récupérer les accents (é , è , à) avec Event::TextEntered alors qu'avec les caractères classique sa marche

Voici le code:
    std::string texte;
    sf::Event event;

    while(window.pollEvent(event)){
        if(event.type == sf::Event::Closed){
            window.close();
        }
        if(event.type == sf::Event::TextEntered){
            texte = event.text.unicode;

            std::cout<<texte<<std::endl;
        }
    }
 

Merci de m'aider
« Modifié: Août 30, 2016, 07:22:13 pm par valentin_616 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème accents
« Réponse #1 le: Août 30, 2016, 07:54:01 am »
std::cout n'est certainement pas paramétré par défaut pour afficher de l'UTF-32. Trouve un autre moyen de vérifier ce que tu obtiens, avec sf::Text par exemple. Ou alors convertis de l'UTF-32 vers ce que std::string utilise sur ta machine, avec sf::Utf.
Laurent Gomila - SFML developer

valentin_616

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Problème accents
« Réponse #2 le: Août 30, 2016, 01:12:41 pm »
Merci de cette réponse sa fait plaisir de voir un développeur de SFML proche de sa communauté.

Mais le problème ne viens pas de "cout"  ou  des "strings"  car ce code fonctionne :
string texte;
texte = "éèêà";
cout<<texte<<endl;
 

Le résultat dans mon terminal (je suis sur ubuntu) est : "éèêà".

J'ai essayé sf::Utf<32> mais je ne comprends pas comment sa fonctionne.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème accents
« Réponse #3 le: Août 30, 2016, 02:06:01 pm »
Citer
Mais le problème ne viens pas de "cout"  ou  des "strings"  car ce code fonctionne
Parce que ton éditeur de texte et/ou ton compilo utilisent le même encodage que std::cout et/ou ta console. A savoir UTF-8 sous Unix, et probablement CP1252 sous Windows. Quand tu tapes "é" dans ton code source, ce n'est pas la même valeur qu'un "é" récupéré via un évènement SFML, bien que ce soit la même lettre. Car différents encodages sont utilisés.

Il faut bien comprendre qu'à chaque étape où du texte est manipulé (édition du fichier source, compilation, interprétation par std::cout, affichage dans la console), il y a potentiellement un encodage qui entre en jeu, et si un seul d'entre eux diffère de ce qui est attendu, le texte sera altéré. Tu ne peux donc pas tirer des conclusions à la légère.

La seule manière d'être sûr que quelque chose fonctionne ou ne fonctionne pas, c'est d'être certain que tous les encodages qui entrent en jeu, depuis l'aquisition du texte jusqu'à son affichage final, sont compatibles entre eux. Ce qui n'est pas le cas, puisque SFML travaille en UTF-32 et pas le reste. Comme je l'ai dit, la seule façon fiable d'afficher le résultat de l'évènement sf::TextEntered directement, c'est via un sf::Text.
Laurent Gomila - SFML developer

valentin_616

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Problème accents
« Réponse #4 le: Août 30, 2016, 07:21:33 pm »
Merci le problème est résolu.
    sf::Event event;
    std::string texte;

    while(window.pollEvent(event)){
        if(event.type == sf::Event::Closed){
            window.close();
        }
        if(event.type == sf::Event::TextEntered){

            //si le caractères est égal au nombre qui correspond alors texte est égal au bon caractère
            if(event.text.unicode == 224){
                texte = "à";
            }
            else if(event.text.unicode == 232){
                texte = "è";
            }
            else if(event.text.unicode == 233){
                texte = "é";
            }
            else if(event.text.unicode == 234){
                texte = "ê";
            }
            else{
                texte = event.text.unicode;
            }
            std::cout<<texte<<std::endl<<std::endl;
        }
    }
 

C'est pas optimal mais sa fonctionne.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] Problème accents
« Réponse #5 le: Août 30, 2016, 08:10:01 pm »
Citer
sa fonctionne
Question de point de vue... :P

Quelle est la finalité de ton code ? Que vas-tu faire avec la chaîne au final ? Est-ce que tu as vraiment besoin d'utiliser std::string ? Et std::cout aussi, ou bien c'est juste pour tester ?
Laurent Gomila - SFML developer

valentin_616

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [Résolu] Problème accents
« Réponse #6 le: Août 30, 2016, 08:43:11 pm »
Le but de mon programme est de poser une question à l'utilisateur et de vérifier si sa réponse est juste ou fausse. L'utilisateur pourra créer ses propres questionnaires.
Mais pour cela il me faut pouvoir récupérer le réponse de l'utilisateur dans un "std::string" car je peux facilement le comparer à un autre et l'afficher avec SFML.
Je ne vais donc pas utiliser "std::cout" mais "sf::Text" pour l'afficher.
Je donnerai le code source et le programme compilé dans la rubrique "Projects SFML" quand j'aurai terminé ou suffisamment avancé.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] Problème accents
« Réponse #7 le: Août 30, 2016, 09:00:21 pm »
Citer
Mais pour cela il me faut pouvoir récupérer le réponse de l'utilisateur dans un "std::string" car je peux facilement le comparer à un autre et l'afficher avec SFML.
Je ne vais donc pas utiliser "std::cout" mais "sf::Text" pour l'afficher.
Pourquoi pas le stocker dans un sf::String alors ? C'est comparable, ça prend de l'UTF-32, et c'est affichable directement via un sf::Text. Le tout sans aucune conversion.
Laurent Gomila - SFML developer

valentin_616

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [Résolu] Problème accents
« Réponse #8 le: Août 31, 2016, 11:49:30 am »
J'ai refais un petit programme avec le sf::String pour tester et sa marche nickel Merci Beaucoup.

#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <fstream>
#include <cinttypes>


sf::RenderWindow window; //je préfère mettre window en global car je vais l'utilise dans beaucoup de fonctions
sf::String texte; //il est global pour tester mais ne le restera pas
sf::Font font; //font pour tout le programme

void controles(){
    sf::Event event;
    sf::Text texteAfficheable;
    texteAfficheable.setFont(font);
    texteAfficheable.setCharacterSize(100);
    texteAfficheable.setPosition(200,200);


    while(window.pollEvent(event)){
        if(event.type == sf::Event::Closed){
            window.close();
        }
        if(event.type == sf::Event::TextEntered){
            texte = event.text.unicode;
        }
    }

    texteAfficheable.setString(texte);
    window.draw(texteAfficheable);
    window.display();
    window.clear();
}

int main()
{
    font.loadFromFile("Police.ttf");
    window.create(sf::VideoMode(1280,720),"Fenêtre",sf::Style::Close);
    window.setVerticalSyncEnabled(true);

    while(window.isOpen()){
        controles();
    }
    return 0;
}
 

C'est juste dommage que pour écrire ou récupérer du texte dans un fichier l'opérateur << ne soit pas surchargé et qu'on doive utiliser texte.toAinsiString().

Et pour finir une petite question : si je fais un programme qui n'as pas besoin d'utf32 est il mieux d'utiliser sf;:String ou std::string ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] Problème accents
« Réponse #9 le: Août 31, 2016, 12:25:16 pm »
Citer
C'est juste dommage que pour écrire ou récupérer du texte dans un fichier l'opérateur << ne soit pas surchargé et qu'on doive utiliser texte.toAinsiString().
Là encore, il y a des histoires d'encodage qui entrent en jeu et ce n'est pas simple. Il faut savoir comment est encodé ton fichier et utiliser les fonctions de conversion adéquates (sf::String::ToXxx/fromXxx). Et donc oui, dans tous les cas il te faut un conteneur intermédiaire (std::string par exemple).

Citer
Et pour finir une petite question : si je fais un programme qui n'as pas besoin d'utf32 est il mieux d'utiliser sf;:String ou std::string ?
sf::String est une class en trop dans SFML, normalement elle ne devrait pas exister. La seule raison pour laquelle elle est là, c'est pour gérer les conversions automatiquement entre std::string / char* et les fonctions SFML qui gèrent des chaînes Unicode. Donc si tu n'utilises pas ces fonctions, inutile de t'embêter avec sf::String.
« Modifié: Août 31, 2016, 12:27:20 pm par Laurent »
Laurent Gomila - SFML developer

valentin_616

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [Résolu] Problème accents
« Réponse #10 le: Août 31, 2016, 12:40:15 pm »
Merci pour toutes ces informations utiles et merci à toute l'équipe SFML pour cette géniale api.  :)