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

Auteur Sujet: [SFML2] Utiliser les accents  (Lu 5638 fois)

0 Membres et 1 Invité sur ce sujet

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
[SFML2] Utiliser les accents
« le: Octobre 14, 2012, 09:49:32 am »
Bonjour,

Désolé si ce fut déjà abordé mais j'ai pas trouvé sur le forum malgré la recherche.

Je suis entrain de faire des tests car je suis habitué à SFML1.6 et je viens de passer sur SFML2. Dans mes tests j'ai essayé de mettre un accent dans le titre de la fenêtre, mais ce dernier ne s'affiche pas. Problème d'encodage mais je ne sais pas comment corriger cela.

Je suis sous Windows 7, qui n'utilises toujours pas nativement l'UTF-8, mais mon code lui est en UTF-8 (car a terme il sera aussi utiliser sous Linux qui lui est en UTF-8 et à donc besoin de cet encodage).

Je voudrais savoir comment corriger le problème à part en revenant en Windows-CP1252 ce qui n'est pas du tout l'idéal.


MErci d'avance pour votre aide.

P.S. : Je suis sur un code minimal : une fenêtre et un titre point barre ;)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #1 le: Octobre 14, 2012, 10:15:11 am »
Ce n'est pas encore vraiment  supporté au niveau de SFML. SFML passe ton titre tel quel directement à la fonction Win32 qui crée la fenêtre (CreateWindow), donc il faut voir la doc pour savoir quel encodage est attendu, et comment éventuellement le contrôler.
Laurent Gomila - SFML developer

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #2 le: Octobre 14, 2012, 11:05:59 am »
Donc si je suis sous Windows je suis obligé d'avoir une copie du code en Windows-cp1252 ?

C'est dommage d'être ainsi limité tout ça parce que Microsoft refuse d'intégrer les standards.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #3 le: Octobre 14, 2012, 11:34:44 am »
Citer
Donc si je suis sous Windows je suis obligé d'avoir une copie du code en Windows-cp1252 ?
Non. Il faut juste que tu identifies quel encodage attend la fonction CreateWindow, et que tu fournisses une chaîne compatible.

Citer
C'est dommage d'être ainsi limité tout ça parce que Microsoft refuse d'intégrer les standards.
Tu es limité parce que SFML ne supporte pas cette fonctionnalité. Windows quant à lui la supporte très certainement. Et quel "standard" ? Ce sont des fonctions de leur API, ils font ce qu'ils veulent. Et au passage, le problème est exactement le même sur les autres OS (c'est juste que pour toi, UTF-8 est plus pratique à manipuler).
Laurent Gomila - SFML developer

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : Re : [SFML2] Utiliser les accents
« Réponse #4 le: Octobre 14, 2012, 12:00:01 pm »
Non. Il faut juste que tu identifies quel encodage attend la fonction CreateWindow, et que tu fournisses une chaîne compatible.

Soucis : la MSDN ne dit pas, par contre on sait que Windows est en cp1252 et la console en cp850.

Tu es limité parce que SFML ne supporte pas cette fonctionnalité. Windows quant à lui la supporte très certainement. Et quel "standard" ? Ce sont des fonctions de leur API, ils font ce qu'ils veulent. Et au passage, le problème est exactement le même sur les autres OS (c'est juste que pour toi, UTF-8 est plus pratique à manipuler).

Ben je sais que Linux est passé en UTF-8 depuis plusieurs années, donc tout les programmes dont le code est en UTF-8 passent sans aucune intervention au niveau de l'encodage. Pour Mac ils sont passés aussi à l'UTF-8 ; seul MS refuse le passage. D'ailleurs si j'ai bonne mémoire le windows-cp1252 est un encodage créer par MS pour Windows, alors que les autres n'ont pas créer d'encodages spéciaux pour eux.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #5 le: Octobre 14, 2012, 12:21:15 pm »
L'API Windows vient en deux versions : "ANSI" (encodage 8-bits dépendant de l'environnement), et UTF-16. Si tu appelles la version UTF-16 de CreateWindow (CreateWindowW), tu peux passer une chaîne UTF-16 sans problème. Le seul problème, c'est que SFML ne propose pas encore cette option.

L'encodage à utiliser en version "ANSI" est en effet assez mal documenté, mais cp1252 devrait faire l'affaire oui. Note que ce n'est pas un encodage si "non-standard" que ça, puisque c'est une extension de latin-1 qui est lui-même le sous-ensemble 8-bits de UTF-16 et UTF-32 ;)
Laurent Gomila - SFML developer

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #6 le: Octobre 14, 2012, 02:24:07 pm »
Je pense me tourner vers libiconv pour convertir du UTF-8 en ANSI si je suis sur un environnement Windows, tu en penses quoi ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #7 le: Octobre 14, 2012, 03:38:47 pm »
Je pense qu'il y a plus simple.

SFML utilise MultiByteToWideChar pour transformer ta chaîne ANSI en UTF-16, du coup toi tu peux faire l'inverse : crée une chaîne UTF-16 (wide string, avec L"...") et utilise WideCharToMultiByte pour la convertir en chaîne ANSI. Comme SFML fait l'opération inverse, tu es sûr que le résultat sera identique à ce que tu avais en entrée.

Si tu veux voir quels paramètres SFML utilise pour appeler MultiByteToWideChar, voici la ligne en question :
https://github.com/SFML/SFML/blob/master/src/SFML/Window/Win32/WindowImplWin32.cpp#L138
Laurent Gomila - SFML developer

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #8 le: Octobre 14, 2012, 04:40:18 pm »
Merci pour ta réponse je vais voir ça.
Pour ce qui est du L, quand je teste il me renvoi une erreur, j'ai donc laissé tombé.

EDIT : Je viens de tester, le problème est qu'il me dit qu'il refuse les wchar_t, donc je ne sais pas trop comment faire, si tu pouvais m'aider.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #9 le: Octobre 14, 2012, 06:46:25 pm »
Quel est ton compilo est quelle est l'erreur exacte ?
Laurent Gomila - SFML developer

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #10 le: Octobre 14, 2012, 11:16:06 pm »
Merci de ta réponse Laurent et désolé de mon temps de réponse.

Voici l'erreur :
Citer
||=== RenderWindow, Debug ===|
C:\prog\cpp\SFML\2.0\tests\RenderWindow\main.cpp||In function 'int main()':|
C:\prog\cpp\SFML\2.0\tests\RenderWindow\main.cpp|8|error: no matching function for call to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(wchar_t [256])'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.tcc|220|note: candidates are: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(typename _Alloc::rebind<_CharT>::other::size_type, _CharT, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.tcc|213|note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.tcc|206|note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, typename _Alloc::rebind<_CharT>::other::size_type, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.tcc|194|note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&, typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.tcc|184|note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&, typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.tcc|170|note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.tcc|178|note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\basic_string.h|2147|note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
||=== Build finished: 1 errors, 0 warnings ===|

Je suis sous windows 7 avec gcc 4.4.1 installé par codeblocks.

Et voici le code que j'ai utilisé :
#include <SFML/Graphics.hpp>
#include <windows.h>

int main(void)
{
        wchar_t wTitle[256];
        MultiByteToWideChar(1252, MB_PRECOMPOSED, "é", 1, wTitle, 0);
        sf::RenderWindow window(sf::VideoMode(800, 600), std::string(wTitle));

        window.display();

        while (window.isOpen())
    {
        // on inspecte tous les évènements de la fenêtre qui ont été émis depuis la précédente itération
        sf::Event event;
        while (window.pollEvent(event))
        {
            // évènement "fermeture demandée" : on ferme la fenêtre
            if (event.type == sf::Event::Closed)
                window.close();
        }
    }

        return 0;
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #11 le: Octobre 15, 2012, 07:58:07 am »
T'as pas du tout compris ce que j'ai dit ;D

Il faut que tu fasses l'opération inverse :

char title[256];
WideCharToMultiByte(..., L"é", ...);

sf::RenderWindow window(sf::VideoMode(800, 600), title);
Laurent Gomila - SFML developer

minirop

  • Sr. Member
  • ****
  • Messages: 254
    • Voir le profil
    • http://dev.peyj.com
Re : [SFML2] Utiliser les accents
« Réponse #12 le: Octobre 16, 2012, 12:49:56 pm »
quitte à faire du "pas portable", ça serait pas plus simple de faire ceci (code non testé) ?
// window est sf::RenderWindow crée avec un titre "bidon"
SetWindowText(window.getSystemHandle(), L"tété");

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32453
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #13 le: Octobre 16, 2012, 02:08:34 pm »
Aussi, oui. Mais avec SetWindowTextW pour être sûr d'avoir la version qui prend un wchar_t*.
Laurent Gomila - SFML developer

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : [SFML2] Utiliser les accents
« Réponse #14 le: Octobre 19, 2012, 10:50:40 am »
Merci pour vos réponses, je testerais ça.