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

Langage C++ Discussion :

define et concatenation de chaine caractère - UTF8


Sujet :

Langage C++

  1. #1
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut define et concatenation de chaine caractère - UTF8
    Bonjour,

    Pour que mon code soit indépendant de l'encodage des caractères j'ai fait un simple define :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef EMV_UNICODE
    #define EMV_T( x ) L ## x
    #else
    #define EMV_T( x ) x
    #endif
    Et pour faire mes assertions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define EMV_ASSERT( bExpression, ... ) \
    eMV::EmvAssert( EMV_T( #bExpression ), EMV_FILE, EMV_LINE, EMV_FUNCTION, EMV_T( ##__VA_ARGS__ ), EMV_T( "" ) ) )
    Et en utilisation ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EMV_ASSERT( uVar >= 0, "Valeur négative... Pas bien !" ); // OK
    EMV_ASSERT( bTest ); // Error C2065: 'L' : undeclared identifier
    Ce qui est normal puisque le paramètre 5 de mon eMV::EmvAssert c'est EMV_T( ##__VA_ARGS__ ) donc ça donne L.

    La solution simple serait de remplacer tous mes EMV_ASSERT( condition ) par EMV_ASSERT( condition, "" ). Mais c'est assez lourd et ça demande beaucoup de changement dans mon code... J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define EMV_T( x ) L ## "" ## L ## x
    Mais ça ne fonctionne évidement pas... Puisque pour un EMV_ASSERT sans message, ça donne L""L...

    Donc j'aimerais avoir votre avis pour savoir comment vous auriez résolu ce problème sans reparcourir tout le code en ajoutant des "" useless...

    Merci

  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,

    A priori, pour un assert, tu n'es même pas obligé de "jouer" avec l'unicode...

    En effet, un assert apparait uniquement dans la console, et en mode débug, encore!

    L'idée est donc de les laisser aussi simples que possible, en t'assurant "simplement" de fournir une indication qui te permettra de comprendre pourquoi ton programme a asserté.

    Si tu places un message non accentué pour indiquer la raison du refus, tu n'en feras pas vraiment une maladie

    Par contre, les règles de fonctionnement de l'assert, voir, qui sait, les différents assert possibles, auraient sans doute du être fixés une bonne fois pour toutes au tout début du développement, en tant qu'outil "indispensable" pour t'assurer du respect des différents contrats

    Il t'aurait alors appartenu de veiller, au fur et à mesure, à respecter les règles de fonctionnements imposées par l'assert

    Ceci dit, en t'aidant d'outils simples (un "rechercher/remplacer dans la solution" éventuellement agrémenté d' expressions régulières), il devrait être possible de changer la forme de tes assert dans l'ensemble de ton projet de manière à rajouter deux double quotes dans les assert qui en ont besoin

    Comme les define sont de toutes manières des symboles qui sont convertis avant même que le compilateur ne commence à essayer de voir le contenu du code, tous les fichiers contenant des assert devront quoi qu'il en soit être recompilés, quelque soit la solution envisagée.

    Autant donc essayer de tout faire automatiquement
    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 actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    C'est le même principe utilisé pour le log qui peut être disable avec des FLAG...

    Donc j'ai une autre question en rapport avec celle-ci :

    Que se passe-t-il donc si mon programme tourne sur un PC Japonais alors que je l'ai compilé avec UTC-2 par exemple ? Les sorties seront-il lisible ?

  4. #4
    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
    Tout dépendra de toutes façons du jeu de caractères utilisé par la console...

    Car, il et clair que, si la console utilise par défaut les caractères japonais alors que ton code entier (et surtout les sorties consoles) est écrit (sont écrites) en latin1, tu risques très clairement d'avoir un résultat surprenant à l'affichage (en dehors de tout processus fournissant une traduction)

    Mais il est, de toutes manières possible de choisir le jeu de caractères utilisés par la console

    Ceci dit, même en Belgique, il n'est pas rare de voir que tout le code est écrit, purement et simplement, en anglais, même si on propose une interface graphique.

    L'idée est que l'on peut alors parfaitement se contenter de la table de caractères ASCII tant que l'on est au niveau du business (avec l'anglais, on n'a même pas besoin des caractères accentués ), que l'interface graphique est fournie, de base, en anglais, bien qu'utilisant un codage souvent multi-byte (UTF ) et que l'on mette en place un système de traduction, qui lui utilisera le codage "adéquat" par rapport à la langue dans laquelle on fait la traduction.

    Je travaille pour l'instant pour la SNCB (la société de chemins de fers belges ) et le projet sur lequel je suis est intégralement géré en anglais, depuis les analyses fonctionnelles jusqu'à l'interface graphique affichée par défaut (développée avec Qt).

    Mais on fournit des fichiers de traduction pour le francais, le néérlandais et même l'allemand
    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

  5. #5
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Dans mon cas je dois faire des sorties de flux dans différent encodage particulier (différent build pas de changement dynamique).
    Ce que je fais c'est que j'ai juste une surcharge des flux standard en fonction des flags dans la build.

    Ma class eMV::String peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::basic_string<char, ...>
    std::basic_string<std::wchar_t, ...>
    std::basic_string<std::char16_t, ...>
    std::basic_string<std::char32_t, ...>
    Et pareil pour les FileStream, StringStream, ... Avec mes allocateurs etc...

    Donc pour les asserts c'est hors de promo (puisque juste pour le dev), mais pour le reste je devrais faire plus attention.

    Sinon je suppose que pour changer l'encodage des caractères de la console c'est des fonctions OS ?

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

Discussions similaires

  1. concatenation, chaine caractère
    Par hellskitchen dans le forum Windows Forms
    Réponses: 13
    Dernier message: 03/03/2010, 12h42
  2. Réponses: 1
    Dernier message: 17/04/2009, 19h56
  3. Concatenation de chaine de caractère.
    Par alexglvr dans le forum Débuter
    Réponses: 2
    Dernier message: 24/01/2009, 14h04
  4. [SQL] : Concatener des chaines de caractères
    Par basto dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/04/2007, 16h47
  5. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 15h25

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