Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: christophedlr le Octobre 14, 2012, 09:49:32 am

Titre: [SFML2] Utiliser les accents
Posté par: christophedlr 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 ;)
Titre: Re : [SFML2] Utiliser les accents
Posté par: Laurent 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.
Titre: Re : [SFML2] Utiliser les accents
Posté par: christophedlr 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.
Titre: Re : [SFML2] Utiliser les accents
Posté par: Laurent 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).
Titre: Re : Re : [SFML2] Utiliser les accents
Posté par: christophedlr 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.
Titre: Re : [SFML2] Utiliser les accents
Posté par: Laurent 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 ;)
Titre: Re : [SFML2] Utiliser les accents
Posté par: christophedlr 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 ?
Titre: Re : [SFML2] Utiliser les accents
Posté par: Laurent 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
Titre: Re : [SFML2] Utiliser les accents
Posté par: christophedlr 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.
Titre: Re : [SFML2] Utiliser les accents
Posté par: Laurent le Octobre 14, 2012, 06:46:25 pm
Quel est ton compilo est quelle est l'erreur exacte ?
Titre: Re : [SFML2] Utiliser les accents
Posté par: christophedlr 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;
}
 
Titre: Re : [SFML2] Utiliser les accents
Posté par: Laurent 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);
Titre: Re : [SFML2] Utiliser les accents
Posté par: minirop 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é");
Titre: Re : [SFML2] Utiliser les accents
Posté par: Laurent 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*.
Titre: Re : [SFML2] Utiliser les accents
Posté par: christophedlr le Octobre 19, 2012, 10:50:40 am
Merci pour vos réponses, je testerais ça.
Titre: Re : [SFML2] Utiliser les accents
Posté par: christophedlr le Octobre 19, 2012, 03:33:01 pm
Laurent,

C'est bon ça marche, merci beaucoup pour l'aide apporté.