IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Encoder un std::string en Latin1


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Encoder un std::string en Latin1
    Bonjour,

    Depuis peu j'essaye de me lancer dans l'apprentissage de la programmation.
    Je suis nouveau sur ce forum.

    Ma question et le suivant :
    Existe t'il une méthode ou une fonction pour encoder un std::string en Latin1?

    Si cette question à déjà été traité dans le forum je m'en excuse mais je ne l'es pas trouvé
    Merçi d'avance

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut, et bienvenue sur le forum.

    Malheureusement, ce que tu appelle "latin1" est en réalité... la norme ISO 8859-1, également souvent appelée (à tord) "une table de caractères unicode" et est donc composé... de caractères potentiellement représentés sur plus d'un byte.

    Or, il se fait que la classe std:: string est en réalité une spécialisation (de la classe std::basic_string, pour être complet) basée sur... la table de caractère ASCII (utilisant des caractères codés sur... 1 byte seulement).

    Tu remarqueras donc tout de suite que la classe std::string n'est pas adaptée à la représentation de chaines de caractères suivant le codage "latin1" ;P

    La classe à utiliser pour la représentation de telles chaines de caractères est en réalité la classe std::wstring (qui est la spécialisation de std::basic_string pour les caractères unicodes).

    Il faut cependant prendre en compte le fait que tu dois utiliser les spécialisation unicode pour:
    • lire/écrire dans un fichier (wifstream et wofstream)
    • effectuer des conversions (wistringstream, wofstringstream et wstringstream)
    • effectuer les saisie ou les sorties sur les entrées ou sorties standard (wcin et wcout)
    • ...

    Il faut enfin être conscient que leur utilisation en ligne de commande (shell sous unixoide, invide de commande windows) sera sans doute correctement effectuée sous unixoide, mais que la ligne de commande windows risque de très mal interpréter les chaines de caractères utilisée

    Tu trouvera quelques information dans la FAQ avec cette entrée (sur wstring) ou celle-ci celle-ci (sur la conversion ASCII<->unicode)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci pour ton chaleureux accueil et pour cette réponses complète.

    J'ai donc créer dans ma classe la méthode qui me permet de transformer un ASCII en Unicode.

    Ce que j'aimerai faire c'est enregistrer ma chaine Unicode dans un fichier texte.
    Avec ofstream je peux lui donner un std::string mais pas de wstring.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ofstream fichier("tableau1.txt", ios::out | ios::trunc);
    fichier << chaineUnicode << endl;
    Comment résoudre ce probléme?
    Merci d'avance

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Attention, Latin1 ou ISO 8859-1 n'a rien à voir avec Unicode. C'est une table de 256 caractères, un caractère tiens donc dans un char et std::string suffit.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Oui... je vois pas trop le rapport avec l'unicode non plus...

    Toutes les ISO 8859 sont des page de code "single byte" (un octet = un caractère). Il en existe 16 différentes en fonction de la "région" désirée, et sont toutes des sur-ensembles de l'US-ASCII, et parfaitement gérés par std::string.
    En France,on utilise plutôt l'ISO 8859-15 d'ailleurs (prise en charge de € notamment), ou, encore plus fréquemment, Windows-1252

    D'ailleurs, std::string peut aussi gérer de l'UTF-8 sans problême (la norme ne permet pas d'avoir des '\0' au milieu du texte).

    std:wstring est utilisé pour gérer l'UCS-2, mais aussi l'UTF-16 (plus communément appelé sous windows "UNICODE").

    Le choix entre les deux dépend essentiellement de l'utilisation... Si la majorité des cas est une utilisation de l'ASCII, alors l'UTF-8 est conseillé (tous les caractères ASCII sont codés en un seul octet). Mais le symbole euro (€) utilisera 3 octets, alors qu'il n'en prendra que deux en UTF-16.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par CraPu!e Voir le message
    Existe t'il une méthode ou une fonction pour encoder un std::string en Latin1?
    A partir de quoi? Avec une locale adequate (a priori
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::global(std::locale(""))
    dans le main devrait suffire pour avoir une locale adequate; si ce n'est pas le cas, les problemes commencent) les fonctions qui dependent du jeu de caracteres codes traitent les char comme designant des caracteres de Latin-1.

    Citation Envoyé par koala01 Voir le message
    Malheureusement, ce que tu appelle "latin1" est en réalité... la norme ISO 8859-1, également souvent appelée (à tord) "une table de caractères unicode" et est donc composé... de caractères potentiellement représentés sur plus d'un byte.
    Tu fais de la confusion ici. ISO 8859-X c'est une serie de jeux de caracteres codés sur 8 bits.

    [quote]Or, il se fait que la classe std:: string est en réalité une spécialisation (de la classe std::basic_string, pour être complet) basée sur... la table de caractère ASCII (utilisant des caractères codés sur... 1 byte seulement).

    ASCII est un jeu de caracteres code sur 7 bits. (ISO 646-XX c'est une serie de jeux de caracteres codés sur 7 bits; la variante US est ASCII, suivant les versions, la variante internationale et la variante francaise lui sont identiques -- cas des dernieres versions -- ou pas.)

    ISO 8859-X reprend les 128 premiers caracteres de l'ASCII.

    Citation Envoyé par nicroman Voir le message
    Oui... je vois pas trop le rapport avec l'unicode non plus...

    Toutes les ISO 8859 sont des page de code "single byte" (un octet = un caractère). Il en existe 16 différentes en fonction de la "région" désirée, et sont toutes des sur-ensembles de l'US-ASCII, et parfaitement gérés par std::string.
    En France,on utilise plutôt l'ISO 8859-15 d'ailleurs (prise en charge de € notamment), ou, encore plus fréquemment, Windows-1252
    Ce jeu de caractere code a les inconveniants d'etre propre a Windows d'une part et de ne pas respecter la structure definie par ISO 2022 (ce que font ISO 8859, mais ne font pas les different UTF).

    D'ailleurs, std::string peut aussi gérer de l'UTF-8 sans problême (la norme ne permet pas d'avoir des '\0' au milieu du texte).
    Avec une locale adequate.

    std:wstring est utilisé pour gérer l'UCS-2, mais aussi l'UTF-16 (plus communément appelé sous windows "UNICODE").
    UTF-32 (UCS-4) aussi. A noter que de maniere strictre UTF-16 ne devrait pas etre utilise (UCS-2 bien).

    A noter que l'appellation unicode pour UTF-16 (ou UCS-2) n'est pas incorrecte mais un peu trop large.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    La methode globale n'a pas l'aire d'exister... Mon debbuger m'indique que global n'est pas membre de std...

    Existe t'il un tutoriels en français si possible traitant sur les tables de caractére en c++

    Voici un methode que j'ai écrite pour se positionner dans une ligne précise dans un fichier et
    renvoyer un wstring de ca valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    wstring EditModalite::stringLine(wifstream &fichier, int ligneDepart)
    {
        if(fichier.is_open())
        {
            //On se positionne à la ligne indiquer
            wchar_t caractereLu;
            while (ligneDepart > 0)
            {
                fichier.get(caractereLu);
                if (caractereLu == '\n')
                    ligneDepart--;
            }
     
            //Lecture de la ligne et repositionnement du curseur au début du fichier
            wstring ligneLu;
            getline(fichier, ligneLu);
            fichier.seekg(0, ios_base::beg);
     
            return ligneLu;
        }
    }
    Tous ce passe bien lors de la compilation mais lors du lancement ca plante, et ceci semble venir de la ligne 7 fichier.get(caractereLu)

    Qu'es que je dois faire?

    Merci pour votre aide

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par CraPu!e Voir le message
    La methode globale n'a pas l'aire d'exister... Mon debbuger m'indique que global n'est pas membre de std...
    Oops, std::locale::global.

    Existe t'il un tutoriels en français si possible traitant sur les tables de caractére en c++
    Je ne connais rien dans le style "tutoriel".

    Sur les locales: http://www.research.att.com/~bs/3rd_loc.pdf

    J'avais commence a écrire quelque chose: http://www.bourguet.org/cpp/caracteres.pdf mais c'est incomplet. Autre chose, limité au C90:
    http://www.bourguet.org/cpp/libc90/caracteres.html.

    J'ai toujours dans l'idée de corriger et complèter, mais j'ai pas trop le temps.
    Et mon style est plus celui d'un essai ou d'une monographie que d'un tutoriel.

    Qu'es que je dois faire?
    Ajouter un reset des flags (pour eofbit en particulier) et du contrôle d'erreur sur les opérations d'IO et voir ce qui plante. Il n'y a rien de manifestement faux à part l'absence de return si le fichier n'est pas ouvert.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. std::string to_string
    Par shirya dans le forum SL & STL
    Réponses: 5
    Dernier message: 20/12/2005, 15h28
  2. Réponses: 7
    Dernier message: 25/11/2005, 17h11
  3. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  4. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  5. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo