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++Builder Discussion :

Caractère et Unicode


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut Caractère et Unicode
    Bonjour à tous !

    Depuis quelque temps je cherche sur Internet comment avoir le caractère Unicode d'un caractère, sans avoir réussi à faire fonctionner la chose.
    J'ai essayé plein de chose avec les Wide Char, et en utilisant cela:
    int Size = MultiByteToWideChar (CP_ACP, 0, buffer, -1, NULL, 0);
    LPWSTR wUnicode = new WCHAR[Size];
    MultiByteToWideChar (CP_ACP, 0, buffer, -1, wUnicode, Size);
    mais ça donne pas vraiment ce que je veux.

    Ce que j'aimerai obtenir, ce serait comme sur ce site: quand on tape "é" par exemple, on obtient & #233;
    Comment fait-on cela ?


    Merci d'avance !

  2. #2
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    Pour travailler en unicode en C++ tu peux travailler soit :
    -> avec les objets std::wstring de string.h http://c.developpez.com/faq/cpp/?pag...TRINGS_wstring

    ->soit avec la classe WideString de C++ Builder. (ce que je vais choisir comme exemple pour des raisons de compatibilité avec des composants visuel unicode cf plus loin).

    Autant AnsiString est composé de char ,autant WideString est composé de wchar_t ( caratères gérant l'unicode).

    Ce que j'aimerai obtenir, ce serait comme sur ce site: quand on tape "é" par exemple, on obtient & #233;
    Comment fait-on cela ?
    j'ai téléchargé le source du code de ce site qui utilise la fonction charCodeAt en javaScript et qui retourne la valeur unicode .

    on peut la réécrire facilement en c++ grâce à WideString :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // bien sûr on peut condenser le code suivant en écrivant  simplement :
    //  int unicode_value = (int)a_wstring[index];
    // mais là c'est juste pour l'exemple de traduction de la fonction unicode Java charCodeAt
    // et pour montrer qu'un WideString est composé de wchar_t (caractères unicodes).
     
    int __fastcall charCodeAt(WideString ws, int index)
    {
      if(ws==(WideString)"") return -1;
      if(index>ws.Length()) return -1;
      wchar_t c = ws[index];
      return (int)c;
    }
    ici je te fais juste une traduction bête et méchante c++ de la fonction conversion() du script trouvé sur ton site http://www.lexilogos.com/clavier/unicode.htm ( ça va nous permettre de tester...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    WideString __fastcall Conversion(WideString ws){
       WideString code="";
       for(int m=1;m<=ws.Length();m++)
       {
           int unicode_value = charCodeAt(ws,m);
           if(unicode_value<128  && unicode_value!=38)
           {
             code+= WideString((wchar_t)charCodeAt(ws,m));
     
           }else if(unicode_value==38){
              code+="&amp;";
     
           }else {
              code+="&#"+IntToStr(charCodeAt(ws,m)) +";";
           }
       }
       return code;
    }

    Evidemment pour pouvoir tester visuellement il faut des composants Freeware gérant l'unicode (travaillant avec des WideString ),
    que tu as sûrement déjà installé:http://www.tntware.com/delphicontrols/unicode/


    et enfin pour simuler ce que fais ton site on pose 2 TntMemo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //evenement OnChange du TntMemo1:
    void __fastcall TForm1::TntMemo1Change(TObject *Sender)
    {
           WideString a_text = TntMemo1->Text;
           TntMemo2->Text = Conversion(a_text);
    }
    y'a plus qu'à tester :
    par exemple avec :
    éazὴᾨ qui donne & # 233 ; a z & # 8052 ; & # 8104 ;

    PS: pour vérifier la validité de charCodeAt ( ci-enhaut) : voici un tableau de caractère unicode et leur valeurs http://unicode.coeurlumiere.com

    Bonne continuation..

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    Merci beaucoup, je vais tester ça

    A+

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    bonjour, déja merci beaucoup pour les post précédents qui m'ont beaucoup aidé.

    Par contre j'aurai une autre question :

    le code avant fonctionne correctement, mais maintenant je voudrais pouvoir réaliser l'inverse en effet en ayant le code hexa du caractère, je souhaiterais obtenir le caractère dans une WideString,

    dans un premier temps, j'ai utilisé le code suivant pour mettre le code hexa sous un autre format

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WideString __fastcall WideStringToUnicode(WideString ws){
       WideString code="";
       for(int m=1;m<=ws.Length();m++)
       {
            int unicode_value = (int)ws[m];
            code += "&" + IntToHex(unicode_value, 4);
       }
       return code;
    }
    donc pour un é j'obtient &00E9

    maintenant je souhaiterais obtenir l'inverse , j'ai programmé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WideString __fastcall UnicodeToWideString(WideString code){
       WideString ws="";
       WideString buf="";
       for(int m=1;m<=code.Length();m=m+5)
       {
            buf = "$" + code.SubString(m+1,4);
            ws += (WideString)IntToStr((AnsiString(buf)).ToInt());
       }
       return ws;
    }
    En l'utilisant, pour &00E9 j'obtient 233, ce qui correspond à 00E9 en décimal

    donc je fais forcément une erreur

    si quelqu'un pouvait m'aider pour résoudre mon problème

    Merci d'avance

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    voila j'ai trouvé ma solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    WideString __fastcall UnicodeToWideString(WideString code)
    {
       int val = 2;
       int nbchar = code.Length() / 5;
       WideString ws = WideString((WideString)" ", nbchar);
     
       for(int i=1;i<=nbchar;i++)
       {  
            wchar_t c = StrToInt("0x" + code.SubString(val,4));
            ws[i] = c;
            val +=5;
       }
       return ws;
    }

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Par défaut
    Bonjour,

    Moi aussi je cherche comment avoir le caractère Unicode d'un caractère (Arabe), le code mentionné ci-dessus marche correctement mais pas avec les lettres en arabe.

    Ce que j'aimerai avoir, ce serait quand je tape "ي" par exemple j’obtiens son code décimal
    & #1610;
    SVP comment fait-on cela ?


    Merci d'avance !

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

Discussions similaires

  1. Problèmes Caractères spéciaux (unicode)
    Par echap2000 dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/01/2009, 11h41
  2. Convertir une chaîne de caractères en UNICODE
    Par Godia dans le forum Développement
    Réponses: 4
    Dernier message: 02/07/2008, 16h29
  3. Caractères spéciaux unicode groupés de facon étrange
    Par Reskibil dans le forum Microsoft BI
    Réponses: 2
    Dernier message: 02/05/2008, 09h02
  4. Caractère avec Unicode
    Par rawanex dans le forum Langage
    Réponses: 1
    Dernier message: 14/07/2006, 15h32
  5. [SOAP][Axis] Caractères spéciaux (unicode)
    Par ryk dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 05/12/2005, 19h10

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