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

Auteur Sujet: sf::Text en utf-8  (Lu 5200 fois)

0 Membres et 1 Invité sur ce sujet

Titicplusplus

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
sf::Text en utf-8
« 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

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: sf::Text en utf-8
« Réponse #1 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 ;)
Laurent Gomila - SFML developer

Titicplusplus

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re: sf::Text en utf-8
« Réponse #2 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  ::)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: sf::Text en utf-8
« Réponse #3 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
Laurent Gomila - SFML developer