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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    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 émérite

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    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 confirmé

    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
    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.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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.

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