Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Titicplusplus le Février 20, 2021, 07:44:46 pm

Titre: sf::Text en utf-8
Posté par: Titicplusplus le Février 20, 2021, 07:44:46 pm
Bonjour,
Je suis en train de coder un éditeur de code.
Je n'arrive pas à avoir les lignes en utf-8.

Lorsque je teste avec text.setString(L"é&-[à"). Cela marche et les lignes s'affiche correctement. Ce n'est donc pas ma police d'écriture qui a un problème.

Je ne sais pas d'où vient le problème.
Soit de:

Lorsque je prend le caratère du clavier:

    if (event.type == sf::Event::TextEntered)
          ma_fonction(static_cast<char16_t>(event.text.unicode));

 

Lorsque je modifie ma chaine :

std::string ajout(std::string aba, char16_t x, int position)
{
        std::string real = "";

        for (int i = 0; i < aba.size();  i++)
        {
                if (position == i)
                {
                        real += x;
                }

                real += aba[i];
        }
        std::cout << tailleLargeur << std::endl;
        return real;
}

 

Lorsque je transforme mon vecteur de string en un seul string :

std::string ChangeText::valeur()
{
        std::string aba;

        for (auto i : textstr)
        {
                aba.insert(aba.end(), i.begin(), i.end());
                aba += "\n";
        }

        changement = false;
        return aba;
}
 

ou lorsque j'initialise mon text:
        textEn = textTr.valeur(); /////Retour de la fonction précédente
        text.setString(textEn);
 

Merci d'avance pour vos répones
Titre: Re: sf::Text en utf-8
Posté par: Laurent le Février 20, 2021, 08:26:29 pm
event.text.unicode vers char16_t : tu perds déjà toute la plage UTF-32 qui ne rentre pas dans UCS2.
char16_t vers char : là tu perds toute la plage d'UCS2 qui est > 255.
std::string vers sf::Text : là tu perds potentiellement des choses, mais ça dépend de ta locale.

En gros à chaque conversion tu passes vers un type de données plus petit, sans pour autant compenser avec l'encodage qui va bien. Je te conseille fortement de lire un peu sur le sujet des encodages de texte si tu veux maîtriser un minimum ce que tu codes ;)
Titre: Re: sf::Text en utf-8
Posté par: Titicplusplus le Février 21, 2021, 12:11:12 pm
Merci Laurent, du coup j'ai tout modifié pour le mettre en wstring  ;D

    if (event.type == sf::Event::TextEntered)
          ma_fonction(static_cast<wchar_t>(event.text.unicode));
 

std::wstring ajout(std::wstring aba, wchar_t x, int position)
{
        std::wstring real = L"";

        for (int i = 0; i < aba.size();  i++)
        {
                if (position == i)
                {
                        real += x;
                }

                real += aba[i];
        }
        std::cout << tailleLargeur << std::endl;
        return real;
}

 

std::wstring ChangeText::valeur()
{
        std::wstring aba;

        for (auto i : textstr)
        {
                aba.insert(aba.end(), i.begin(), i.end());
                aba += L"\n";
        }

        changement = false;
        return aba;
}


 

Si quelqu'un passe par là et le même problème  ::)
Titre: Re: sf::Text en utf-8
Posté par: Laurent le Février 22, 2021, 07:50:24 am
Techniquement, si tu es sous Windows, il y a toujours de la perte, puisque tu passes de UTF-32 à UCS2. Tu ne conserves de la plage Unicode que ce que l'on appelle le BMP -- Basic Multilingual Plane. Il contient la majorité des caractères des langues communes... mais pas tout ;)

Si quelqu'un passe par là, la vraie solution est soit :
- d'utiliser sf::String, qui conserve tout en UTF-32
- d'utiliser une vraie bibliothèque de gestion d'encodage de texte, si on veut passer par d'autres encodages