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

Windows Discussion :

Quand Utiliser les fonctions ANSI ou UNICODE?


Sujet :

Windows

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut Quand Utiliser les fonctions ANSI ou UNICODE?
    Bonjour à tous,

    Je débute en programmation windows et mon manque d'expérience me fait défaut. Je n'arrive pas à déterminer sous quels conditions on doit utiliser les fonctions ANSI de Windows.

    J'hésite franchement entre créer une application avec les fonctions génériques de Windows et créer une application qui fait tous ses traitements en unicode directement! J'ai cru comprendre que depuis NT, Windows n'utilise que l'unicode en interne. Donc ma question est : à quoi servent les fonctions ANSI qui de toute façon appellent les fonctions Unicode en transparence? Quand est-ce qu'il faut intégrer le MultiByte-Character set dans un programme windows?

    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par baccali Voir le message
    J'ai cru comprendre que depuis NT, Windows n'utilise que l'unicode en interne.
    C'est exact, de plus, la très grande majorité des fonction existe maintenant Unicode (il reste encore quelques fonctions qui sont MBCS only).

    Citation Envoyé par baccali Voir le message
    Donc ma question est : à quoi servent les fonctions ANSI qui de toute façon appellent les fonctions Unicode en transparence?
    Retro compatibilité ? pour rester compatible avec les anciens projets, ce n'est pas si simple que cela de passer un gros projet de MBCS à UNICODE, il y a pas mal d'effets de bord, il faut tout retester.

    Citation Envoyé par baccali Voir le message
    Quand est-ce qu'il faut intégrer le MultiByte-Character set dans un programme windows?
    Maintenant, je dirais JAMAIS.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Bonjour ram-0000,

    Ok C'est bien ce que je me disais mais quand même je suis pas mal surpris! Cela fait quand même plus de 10 ans qu'on est passé à NT et Microsoft préconise encore d'utiliser les fonctions génériques! C'est pour celà que j'avais un doute.

    Peut-on supposer par exemple que si l'on destine son logiciel à l’internationalisation celui-ci risque de tomber sur un système MBCS? J'ai cru comprendre qu'en Chine et autres pays du genre ils l'utilisent encore ( Sources : http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx ). Peut-être s'agit-il simplement des fichier textes!

    Si c'est le cas ou l'info est périmée tant mieux! Mais sinon si je décide de l'intégrer, sachant que Windows travaillent en UTF-16 en interne, quand est-ce qu'on doit utiliser les fonctions MBCS? Je soupçonne que des "inputs" en MBCS convertit directement en UNICODE pour le reste et reconverties en MBCS pour les sorties seront suffisantes mais comme mon projet risque d'être assez conséquent je ne voudrais pas avoir à réécrire 150 pages de codes au final.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Il me semble que Windows 98 est le dernier OS à travailler NATIVEMENT en MBCS. Depuis, tout le monde maintenant est NATIVEMENT en Unicode.

    Si tu destines ton logiciel à l'internationalisation je ne puis que te conseiller d'utiliser UNICODE. J'ai travaillé sur un projet MBCS porté en Japonais et ce n'était pas simple, il faut une extrême rigueur dans les traitement des chaines de caractères et les (mauvaises) habitudes reviennent vite avec à la clé à chaque fois le même résultat, un bug pas simple à diagnostiquer dans une langue que tu ne maitrise pas :-).

    En ce qui concerne l'API, je suppose que les fonctions Unicode sont les fonctions natives et que les fonctions MBCS transforment leurs entrées/sorties avant d'appeler la vraie fonction Unicode (en tout cas, c'est comme cela que je fais lorsque je dois fournir une API Unicode et MBCS).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Oui effectivement Windows transforme TOUTES les chaînes qui ne sont pas unicode avant de les traîter. TOUTES! Du moins sur un système NT et ce depuis Windows 95 d'après la doc que j'ai.

    Merci pour tes réponses je suis rassuré! Malheureusement comme je bosse sur un logiciel qui doit pouvoir traiter les fichiers unicodes (utf-8, utf-16, utf-32 et malheureusement MBCS et SBCS) je vais devoir bidouiller légèrement mes chaines de charactère mais grâce à toi la portion de code est grandement réduite.

    Cordialement

  6. #6
    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 518
    Points
    41 518
    Par défaut
    Le mieux, c'est de bosser avec des TCHAR partout sauf dans les interactions avec des fonctions n'existant qu'en "ANSI" (genre GetProcAddress()) ou en UTF-16/UCS-2 (genre les fonctions liées à COM).

    Les classes de conversion de ATL (CA2T, CT2A, CW2T, CT2W) sont intéressantes pour ça.

    Et bien sûr, régler le compilo pour que les TCHAR soit interprétés comme des caractères Unicode (macros UNICODE et _UNICODE définies; Visual >= 2005 propose une option du projet qui fait ça toute seule).
    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.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    ... avec des fonctions n'existant qu'en "ANSI" (genre GetProcAddress()) ...
    C'est marrant car la doc MSDN indique que GetProcAddress est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FARPROC WINAPI GetProcAddress(
      __in  HMODULE hModule,
      __in  LPCSTR lpProcName
    );
    donc a priori une fonction TCHAR

    le fichier winbase.h est d'accord avec cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WINBASEAPI
    FARPROC
    WINAPI
    GetProcAddress (
        __in HMODULE hModule,
        __in LPCSTR lpProcName
        );
    Mais il n'y a pas de fonction GetProcAddressA() et GetProcAddressW() dans les headers

    Comment c'est géré lorsque tu es en mode Unicode ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    STR c'est du char *, CSTR du const char *, LP pour les strings est superfu. En gros, LPCSTR = const char *. const TCHAR *, ce sera plutôt LPCTSTR.

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Melem Voir le message
    const TCHAR *, ce sera plutôt LPCTSTR.
    Ah oui, merci, je n'avais pas vu l'absence du T
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Un peu tard mais merci pour ces réponses j'avais un peu délaisser le topic j'ai pas eut beaucoup de temps libre récemment!

    Citation Envoyé par Médinoc Voir le message
    Le mieux, c'est de bosser avec des TCHAR partout sauf dans les interactions avec des fonctions n'existant qu'en "ANSI" (genre GetProcAddress()) ou en UTF-16/UCS-2 (genre les fonctions liées à COM).
    Oui j'avais bien compris mais je voulais surtout savoir pourquoi c'est mieux vu que comme tu le fait remarquer lorsqu'on travaille avec des fonctions susceptibles de ne pas utiliser de l’Unicode on le gère explicitement!

  11. #11
    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 518
    Points
    41 518
    Par défaut
    C'est mieux parce que si jamais les standards changent encore, ce seront les TCHAR qui changeront et tu n'auras pratiquement pas de modifs à faire pour porter ton programme.
    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.

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Ok je te remercie pour ta réponse Medinoc. Juste par simple curiosité quel fut le dernier changement de standard concernant les char (sous windows?) ?

    Sinon Melem, pourquoi dis-tu que Long Pointer pour les strings c'est inutile? Apparemment sur des machines 32 bits et sur des systèmes post 3.1 (et sur des 64 bits aussi je suppose) le T est inutiles quelque soit le type de données. Sur d'autres systèmes ou machines les strings sont gérées différemment?

    Merci

  13. #13
    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 518
    Points
    41 518
    Par défaut
    • Pour l'instant, le seul changement à ma connaissance fut le passage de "ANSI" (entre guilllemets parce que Windows-1252 n'est pas un standard ANSI, en fait) et UCS-2/UTF-16. Mais rien n'empêcherait que dans le futur, on passe à UCS-4/UTF-32, par exemple.
    • Melem dit que la partie "pointeur" dans la description du type est superflue, car une chaîne de caractères est déjà un pointeur. Toutefois, il oublie que la distinction est faite pour les chaînes dans les structures: pointeur ou tableau.
    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.

  14. #14
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Ok merci pour ta réponse concernant les standard.

    Par contre ma question c'était plutôt pourquoi le LONG et non pas sur les pointeurs même, çà je sais comment ça marche. Aurais-tu une idée?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSL]Impossible d'utiliser les fonctions XPath 2.0
    Par cvmz dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/03/2006, 19h19
  2. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    Réponses: 3
    Dernier message: 24/02/2006, 16h59
  3. [Conception] Utiliser les fonctions des tableaux ou plusieurs requêtes ?
    Par Derik dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 01/02/2006, 09h54
  4. Réponses: 3
    Dernier message: 31/12/2005, 23h09
  5. Réponses: 11
    Dernier message: 22/12/2003, 21h06

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