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 :

Unicode, éclaircissement et aide


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut Unicode, éclaircissement et aide
    Bonsoir,

    J'ai voulu insérer dans un programme en C (sous Windows) le symbole ≤ (<= si ça s'affiche pas).

    J'ai d'abord essayé sans changer le reste de mon code, et ça affichait un peu n'importe quoi, j'ai donc compris qu'il fallait utiliser le truc que je ne maitrisais pas du tout, les "wchar_t" (Unicode apparemment).

    Donc, j'ai changé le type des char en wchar_t, les textes "" en L"" et ainsi de suite pour en finir par afficher la chaine de caractères avec MessageBoxW.

    Ça marche bien pour la boite de dialogue concernée, mais tous les autres textes du programme affichent n'importe quoi à la place des caractères accentués.

    Je pensais m'en sortir sans changer le reste du programme, mais visiblement ça ne marche pas ...

    Donc, est-ce que j'aurais loupé un truc et ce que je veux faire (mettre juste une phrase en Unicode parmi de l'ASCII) est possible ?
    Ou faut-il mettre tout le programme en Unicode ? (#define dans le(s) header(s) ?)

    Sinon, l'Unicode est pas défaut sur les OS Microsoft à partir de Windows 2000 et XP, c'est bien ça ?

    Est-ce que vous connaissez un bon cours sur les codages (c'est comme ça qu'on dit ?) en relation avec la programmation ?

    Merci.
    Pierre.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Eh bien typiquement sous Windows, pour éviter d'avoir à convertir tout le programme quand on passe en unicode, on code tout dès le début en utilisant des TCHAR à la place des char et des wchar_t.

    TCHAR au lieu de char, LPTSTR au lieu de char*, LPCTSTR au lieu de const char *, et au lieu des fonctions de <string.h>, on utilise celles de <tchar.h>.
    Et ainsi, on n'a plus qu'à changer deux defines (ou simplement une option de compilation sur un Visual récent) pour tout passer en unicode.

    Là où l'on a toujours quelques problèmes, c'est pour les accents sur la console (il reste des trucs un peu compliqués). Mais hors de la console, le passage à l'unicode est censé résoudre tous les problèmes...
    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
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut
    Merci bien pour cette réponse.

    Expliqué clairement ça devient effectivement plus simple, si ça se trouve dans un peu de temps ça me fera moins peur tout ça ...

    Par contre, TCHAR c'est pas standard, c'est bien seulement sous Windows ?

    Si oui, et si les systèmes qui ne supportent pas l'unicode deviennent rares, il vaut mieux directement utiliser des wchar_t ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut
    Concrètement, il faut mettre #define UNICODE puis passer tous les char en wchar_t ainsi que toutes les chaines "" en L"" et toutes les fonctions standards str* en wcs* ?

    Pour les chaines "", il faut rajouter L, mais pour les caractères uniques, il faut faire L'' aussi ?

    Merci.
    Pierre.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    1. Non, ce n'est pas standard, c'est uniquement pour Windows. Mais avec les bons defines et typedefs, tu peux faire compiler ça en non-unicode ou en non-unicode sur une plate-forme standard...
    2. Ah non, pas du tout! Tu loupe toute l'utilité des TCHAR!
      • Déja, si tu fais tout en unicode, tu n'as pas besoin de #define UNICODE ni de #define _UNICODE (à moins que tu n'utilises les MFC): Ces deux macros n'affectent que les TCHAR.
      • Ensuite, quand tu utilises les TCHAR, tu dois tout passer en TCHAR, les chaînes "" en TEXT("") ou _T(""), et toutes les fonctions str* en _tcs*. Pour les caractères uniques aussi.
    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.

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Le header tchar.h, fournit par le SDK windows (donc fournit sur les plateformes windows) permet de rédiriger les types caractères et les fonction de manipulation de caractères vers les versions ansi ou unicode en fonction d'un seul define.

    Tu peux très bien créer un header tchar.h sous linux par exemple et récupérer la plupart des defines du tchar.h de MS (avec adapations car il y a des entrées pour des fonctions non standard et certaines exclusives MS ainsi que des types MS).

    Comme le dis Médinoc, cela permet d'avoir un code portable.

    Par exemple, je compile mes librairies sous VS2005 (Windows) et GCC (Linux - OpenSuse) en ansi ou en unicode en définissant une seule macro. Le code est donc le même pour tout les builds et indépendant du charset et de la plateforme.

    La seule chose à laquelle il faut faire gaffe, c'est la taille d'un caractère (pour la gestion dynamique de buffer) qui peut être généralement (ce n'est pas une régle absolue) :
    • 1 (char)
    • 2 (wchar_t sous MS et certaines implémentation unix-like)
    • 4 (wchar_t en fonction des implémentations unix-like)
    Sinon par rapport à ta question :
    Sinon, l'Unicode est pas défaut sur les OS Microsoft à partir de Windows 2000 et XP, c'est bien ça ?
    Windows NT 3.5, 4, 5(2000/XP), 6 (VISTA) gère nativement uniquement les chaînes de caractère en unicode (UTF16 - taille de caractère sur 2 octets).
    Donc, sous cet OS, toute les chaines ANSI fournies aux / récupérées des API Win32 sont donc converties en unicode par le kernel pour ses traitement internes
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. aide pour affichage unicode
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 18/12/2012, 12h55
  2. Ajouter une aide
    Par Mailgifson dans le forum C++Builder
    Réponses: 5
    Dernier message: 12/06/2002, 13h32
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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