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

C Discussion :

Conversion de chaine ASCII->Unicode


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Conversion de chaine ASCII->Unicode
    Bonjour.

    J'ai eu beau chercher (MSDN, FAQ & Forums, google...) je ne trouve rien pour convertir proprement et simplement une chaine ascii (du bon vieux char*) en une chaine unicode.

    La seule fonction que j'ai trouvée (grâce a ce forum d'ailleurs) c'est la fonction mbtowc, qui transforme du MultiByte en WideChar. Ayant cherché et compris le fonctionnement du Multibyte charset, je dois admettre que ça fonctionnera vraissemblablement très bien pour convertir du texte sans caractères ascii exotiques. Mais dans le principe, ça me parait anormal d'avoir recours à une interpretation approximative de mon ASCII en Multibyte pour pouvoir en faire de l'unicode.

    N'y a t-il aucune fonction de base pour faire ça ? c'est quand meme une manipulation de chaine de base !

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce qu'on appelle MultiByte, ce sont un ensemble de charsets ASCII étendus.
    La plupart n'ont qu'un seul octet par caractère (comme ASCII, ISO 8859-1 ou CP1252 sous Windows), certains ont un ou deux octets (la plupart des charsets exotiques sous Windows), d'autres peuvent avoir plus (notamment UTF-8).

    Tous rentrent dans la catégorie "multi-byte" sous Windows, par opposition à Unicode.

    De plus, si c'est garanti être de l'ASCII pur, tu peux directement copier la valeur des char dans des wchar_t.
    Ou si c'est garanti être de l'ISO 8859-1, tu peux copier la valeur non-signée des char (donc, castés en unsigned char) dans les wchar_t.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Multibyte regroupe plusieurs char sets...
    c'est intéressant (merci).

    Mais alors quand j'utilise la fonction mbtows, si "Multibyte" ça peut vouloir dire plusieurs charset, comment cette fonction interprete-t-elle ma chaine de char ?
    (note:J'ai employé le terme Multibyte tel que je l'ai compris dans la MSDN.)
    cela dépend d'un reglage windows courant ? (genre je suis en français donc c'est de l'ascii étendu ou qqchose comme ça ? )

    Moi je cherche juste a remplir une chaine unicode:

    unsigned short ChaineU[100]

    a partir de la chaine :

    char chaine1[100] = "blabla";

    N'y a-t-il pas un moyen indépendant du charset local français de mon pc sur le quel je compile ?
    Comme tu le dis, il suffit de copier les char dans des wchar (j'en était pas sur c'est pour ça que j'ai pas osé), c'est pourquoi je m'étonne de ne pas trouver une fonction toute faite...

  4. #4
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Sous Windows, les fonctions MultiByteToWideChar() et WideCharToMultiByte() prennent plus de paramètres que mbtowc() et peuvent donc peut-être faire ce que vous souhaitez. Cependant, vous avez peut-être déjà essayé.

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par zzorglub
    N'y a-t-il pas un moyen indépendant du charset local français de mon pc sur le quel je compile ?
    Comme tu le dis, il suffit de copier les char dans des wchar (j'en était pas sur c'est pour ça que j'ai pas osé), c'est pourquoi je m'étonne de ne pas trouver une fonction toute faite...
    On doit trouver des bibliothèques qui proposent de telles fonctions. La glib, par exemple, exporte des fonctions telles que g_convert(), g_locale_to_utf8() ou g_locale_from_utf8() pour convertir une chaine de caractères d'un charset dans un autre.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut eureka !
    Merci a vous !

    le point que j'avais compris de travers et qui m'avait bloqué, c'est que je croyais que mon char* était encodé dans un format tout a fait universel, or ce n'est vrai que pour la moitié des caractères (ceux ascii) alors que la partie étendue dépend de ma langue française.

    Du coup l'utilisation d'une fonction comme mbtowc qui prend en compte la langue locale (en étant universelle sur les 128 car ascii) devient logique, là où je trouvais ça innaproprié.

    Bon ben je vais enfin pouvoir convertir cette satanée chaine !

    merci

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Copier les char sur les wchar_t ne suffit QUE si le charset "multibyte" utilisé est compatible.

    Sous Windows par exemple, le charset par défaut est la page de codes 1252 (dit Windows-1252 sur internet), qui contient le symbole Euro, absent du charset ISO 8859-1.

    Unicode commence par ISO 8859-1, donc tous les caractères ISO 8859-1 peuvent être copiés directement dans de l'unicode. le symbole Euro ne peut pas.


    La fonction wcstombs() utilise le charset actuel (qui généralement, est ISO8859-1 ou UTF-8 sous Linux et CP1252 sous Windows). Donc, sous Windows, elle fait déjà plus qu'une simple copie.
    Si tu regardes la fonction Win32 MultiByteToWideChar(), tu verras qu'elle prend plusieurs paramètres en plus, notamment un numéro de page de codes. Utiliser wcstombs() équivaut à passer la constante CP_ACP pour ce paramètre.

    Note: Une chaîne "unicode" sous Windows n'est pas en "unicode pur" (UTF-32/UCS-4), mais en UTF-16 : Un wchar_t fait donc 16 bits sous Windows.

    Edit: Post croisé. J'ai été trop lent à poster...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 13
    Dernier message: 16/09/2014, 12h59
  2. Algorithmie C conversion de chaine en code ascii
    Par Onitsha dans le forum Débuter
    Réponses: 19
    Dernier message: 13/10/2011, 12h30
  3. Conversion de ASCII vers Unicode
    Par Arnaud F. dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/10/2008, 15h48
  4. Conversion de chaine vers unicode
    Par viny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/01/2007, 22h22
  5. [C#] Conversion ASCII ou UNICODE
    Par duky02 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/07/2006, 21h07

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