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 :

Comment insérer de l'unicode dans un Richedit ?


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Points : 58
    Points
    58
    Par défaut Comment insérer de l'unicode dans un Richedit ?
    bonjour,

    j'aimerai pouvoir insérer des caractères japonais (qui seront stockés dans une base de données) dans un RichEdit. Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    RichEdit1->SelAttributes->Name    ="MS Mincho";
    RichEdit1->SelAttributes->Charset =SHIFTJIS_CHARSET;
     
    WideString wstr;
    wstr='\u0041';   //--> A en unicode
    RichEdit1->SelText = wstr;
     
    wstr='\u3040';  //--> Hiragano "No" en unicode
    RichEdit1->SelText = wstr;
    J'utilise une police supportant les caractères asiatiques ainsi que le bon charset ; or ce code affichera correctement le "A" mais le caractère asiatique sera remplacé par un "?".

    Quand on insère un caractère asiatique par copier-coller, il s'affiche correctement dans le richedit mais, en examinant la chaine de texte en mémoire, je m'attendais a trouver ce caractère en notation unicode mais là encore, il est remplacé par un "?".

    Bref, j'ai bcp de mal avec l'unicode et je n'ai pas trouvé de solution. Si qq1 avait un ptit tips...

    Merci

  2. #2
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    C'est peut-être un bug car ça marche par copier-coller comme vous le dites mais non par programme même en passant par wchar_t, par exemple le code suivant affiche encore "?".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    wchar_t c='\u3062';
    WideString A;
    A=c;
    RichEdit1->Lines->Add(A);
    Notez qu'en recopiant par programme une ligne unicode, ça plante! Par exemple, on écrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WideString A;
    A=RichEdit1->Lines->Strings[0];
    RichEdit1->Lines->Add(A);
    au clic d'un bouton. Ce code ajoute la première ligne du texte au RichEdit. Si ce texte est "normal", tout se passe bien mais si vous avez par copier-coller affiché des caractères japonais, le programme plante.

    Notez aussi que si vous initialisez via l'explorateur d'objets le texte du RichEdit par un copier-coller, on voit bien les caractères japonais mais à l'exécution, on se retrouve avec "????".

    Si ce n'est pas un bug, rien que pour la plaisir de savoir, j'aimerais bien une réponse de quelqu'un qui aurait eu cette expérience.

    À bientôt
    Gilles

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Points : 58
    Points
    58
    Par défaut pas très élégant...
    Merci de ta réponse Gilles Louïse.

    J'ai a peu près résolu mon problème "en trichant" mais c'est loin d'être élégant. Toutefois, pour l'utilisation simple que je veux en faire, cela suffit (afficher dans un richedit des caractères dont le code est stocké qq part)

    Méthode: construire dans une chaîne un RTF valide (avec les balises) et y insérer les caractères sous la forme "\uxxxxx" (ou \u = balise indiquant un caractère unicode et xxxxx la représentation décimale du caractère).

    On stocke donc la premiere partie du RTF qui contient les infos de fontes, langues... dans une chaîne (sois une fois pour toute, sois on la récupère après que la mise en forme ai été faite durant l'exécution, puis on concatène la série de caractère unicode (note, il doivent être séparés de ' ; par exemple "\u30458'\u30459...") puis au final, on rajoute les balises "fermantes"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //--> décrit un RTF avec une fonte asia, police de taille 10 (fs/2)...
    AnsiString strRTF= "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1036{\\fonttbl{\\f0\\froman\\fprq1\\fcharset128 MS PGothic;}}\\viewkind4\\uc1\\pard\\lang1041\\f0\\fs20";
    //--> ajout des caractère (code décimal normalement récupéré d'une BDD ou autre... )
    strRTF+="\\u30484\'\\u30482"
    //--> ajout des balises fermantes
    strRTF+="\\lang1036\\f1\\par}";
     
    //pour finir, on met à jour le richedit
    TStringStream* strstm = new TStringStream(strRTF);
    RichEdit1->Lines->LoadFromStream(strstm);
    delete strstm;
    Note: lors d'un enregistrement d'un RTF contenant des unicodes par un programme, ce n'est pas la notation décimale qui sera utilisé mais une autre que je n'ai pas vraiment comprise, néanmoins cette représentation est valide et acceptée.

    voilà, ct au cas ou ça interesse qq1, mais une vraie solution serait bien sûr appréciée

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Geek
    Inscrit en
    Mars 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Geek

    Informations forums :
    Inscription : Mars 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Unicode et VCL
    Bonjour,

    J'ai rencontré ce soucis dans le développement d'un éditeur multilangue composé principalement des composants TRichEdit et TTreeView sous C++Borland3/5/6.
    La saisie de textes dans les langues occidentales ne posent pas problème puisque le "code page" utilisé est le même que celui par défaut du PC : cp_1252. Celà est valable sous Win95NT et Win2000NT.
    Dans le cas du russe, pas de problème non plus sous Win95NT sous condition d'affecter au champ "Font->Charset" des composants la constante "RUSSIAN_CHARSET". Par contre, sous Win2000NT, tous les textes russes s'affichent en "???" dans TRichEdit et TTreeView.

    Ce dysfonctionnement s'explique par l'évolution technologique des SE Win2000 & XP par rapport aux SE Win9x.
    En effet, à partir de Win2000, les SE supportent l'unicode contrairement aux SE Win9x. Celà se traduit par une refonte de la base de registres et une gestion différente des "codes pages".
    Comme nos applications sont compilées par défaut en ANSI, les chaînes de caractères, interfaces des composants, sont elles aussi en ANSI : UTF8. D'après mes recherches sur le net, il faut faire basculer toute l'application en unicode pour s'affranchir de ces problèmes.
    Celà implique bien-sûr que les composants supportent l'unicode. Or ce n'est pas le cas pour la VCL d'après des chats et la société "LMD Innovative" qui propose des composants de la VCL compatibles unicode.
    Voir à l'adresse suivante, des chats intéressants sur les pb liés à l'utilisation de l'unicode :
    http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.win32.programmer.international&lang=en&cr=US )

    La solution la moins coûteuse que j'ai pu trouvée est de configurer les "paramètres régionaux système" dans la langue dans laquelle les textes doivent être saisis (ou relus) sous l'éditeur.
    (Chemin de "paramètres régionaux système" :
    "Panneau de config." -> "Options regionales" -> "Valeurs par défaut...")

    Cà fonctionne même pour l'arabe malgré les scripts complexes liés à cette langue!


    Avez-vous réussi la compilation d'une application en unicode?
    J'ai essayé plusieurs combinaisons mais je n'y arrive pas :
    "[Lieur Erreur] Unresolved external 'wWinMain' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER5\LIB\C0W32W.OBJ".
    Pouvez-vous m'aider?
    Merci par avance.

    C.O

  5. #5
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut Re: Comment insérer de l'unicode dans un Richedit ?
    Citation Envoyé par DanaKil
    bonjour,

    j'aimerai pouvoir insérer des caractères japonais
    J'utilise une police supportant les caractères asiatiques ainsi que le bon charset ; or ce code affichera correctement le "A" mais le caractère asiatique sera remplacé par un "?".

    Quand on insère un caractère asiatique par copier-coller, il s'affiche correctement dans le richedit mais, en examinant la chaine de texte en mémoire, je m'attendais a trouver ce caractère en notation unicode mais là encore, il est remplacé par un "?".

    Bref, j'ai bcp de mal avec l'unicode et je n'ai pas trouvé de solution. Si qq1 avait un ptit tips...

    Merci
    Bonjour,

    J'ai découvert le forum hier ! Et j'y ai mis une requête qui parlait de mes problèmes pour écrire des caractères japonais...(Voir le message "Comment gérer des chaînes de caractères japonais ?" du 24 Mars que j'ai malencontreusement placé dans le forum C++ au lieu de celui-ci).

    Tu constateras que j'ai un peu les mêmes problèmes que toi. Quelques différences cependant :

    1 - Autant que je l'ai compris (je suis débutant en C++) l'Unicode n'est pas la même chose que les polices multibytes. Ces dernières utilisent un nombre variable d'octets pour stocker les caractères (le plus souvent 1 ou 2, mais parfois semble-t-il jusqu'à 3 ou 4 !) alors que l'Unicode standardise à 2 le nombre d'octets par caractères. Personnellement, jusqu'à présent je travaille sur Shift_JIS qui est un Charset Multibyte et pas de l'Unicode (encore une fois, je ne maîtrise pas le problème ; c'est ce que j'ai compris mais je peux me tromper). C'est d'ailleurs la raison de mes problèmes : il faut pouvoir repérer les caractères et donc balayer les chaînes depuis le début en sautant d'un caractère chaque fois que l'on voit un caractère mono-octet et de 2 s'il y en a un de deux octets. Il semble qu'il existe des fonctions spéciales pour cela (voir MBCS dans l'aide de Borland C++Builder), par exemple ByteType qui détermine si un octet est seul ou le premier d'un groupe de deux. Mon problème est qu' il faut trouver le moyen de "dire" au système que je veux qu'il m'analyse ma chaîne avec le Charset "Shift_JIS". Deux personnes m'ont déjà conseillé d'utiliser des wchar_t (si je me souviens bien, c'est-à-dire des sortes de "char" sur 2 octets. Mais jusqu'à présent j'ai rechigné à la tâche qui me semble énorme). Je constate que ton problème avec Unicode donne raison à ma circonspection..., car comment dire au programme que l'on parle en "Unicode" ; je pense que cela doit être aussi difficile (ou aussi facile) que de lui dire "ima kara, nihongo hanashimashou" (désolé pour la fonte...), et c'est exactement ça que je ne sais pas faire !!!!!

    2 - J'ai moi aussi constaté qu'un RichEdit marchait bien avec du japonais si l'on faisait un copier-coller (à partir d'un écran WORD d'un fichier utilisant la fonte "MS Mincho", alors que cela ne marchait pas de définir RichEdit par programme : on obtient bien des ????. Par contre, j'ai vu que le Label peut très bien être défini "de l'intérieur" en plaçant les codes byte "à la main" dans une chaine char* (ch[0]=129, ch[1]=37,ch[2]=0, par exemple) et en définissant Label->Caption=AnsiString(ch), à la seule condition que Label->Font soit "MS Mincho" et que Label->Font->Charset soit "Shift_JIS". Ca marche alors très bien !

    Je pense que ce paragraphe 2 répond à l'une de tes questions. En ce qui me concerne, je peux m'en tirer avec des Label, alors je me passerai du RichEdit. J'attends avec impatience celui qui m'indiquera la petite fonction miracle permettant de dire au programme "à partir de maintenant on parle en japonais" et à la fin "bon, revenons à notre bon vieux terroir..." et qui m'autorisera à utiliser ces fameuses fonctions spéciales MBCS.

    Espérant avoir été de quelque utilité. A bientôt

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Points : 58
    Points
    58
    Par défaut
    Merci de vos réponse coger et ceugnier,

    effectivement, je n'ai pas pensé à tester avec un Label mais ce type d'affichage n'est pas bien adapté à l'application que je veux faire
    (un test de connaissance de kanji et de vocabulaire en plein écran en fait, destiné à apprendre ou s'auto-évaluer). De plus les TLabel ne sont pas lissés lorsque la fonte est très grande mais c intéressant de savoir qu'ils prennent l'unicode en charge toutefois.

    Je vais p-e en rester à ma bidouille qui finalement marche assez bien dans mon cas, et qui me permet grâce au richedit de faire une certaine mise en page.

    Une solution que j'avais envisagé qui permettrai de réaliser une mise en page encore plus simplement est l'affichage d'une page HTML (avec le composant IE hélas non présent dans Builder standart), mais je ne sais pas trop comment sont encodés les caractères japonais en HTML (mon problème étant qu'il faut que je puisse saisir le japonais dans mon application, et écrire une page HTML avec ces données...) Je me repencherai sur la question quand mon emploi du temps sera un peu moins chargé...

    Je laisse le post ouvert, on ne sais jamais :]

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Points : 58
    Points
    58
    Par défaut
    Voilà une séries de contrôles supportant l'unicode. Ils sont gratuits et les sources disponibles. Ce sont des contrôles pour delphi à l'origine mais je n'ai eu aucun problème de compilation sur mon Builder 6.

    http://tnt.ccci.org/delphi_unicode_controls/
    http://tnt.ccci.org/delphi_lx_controls/

    Avec ça mon problème devrait être résolu (un gros merci à l'auteur de ces composants en passant)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/08/2006, 02h02
  2. [JNDI] comment insérer de nouveaux objets dans notre annuaire LDAP
    Par julien1981 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 23/06/2006, 15h07
  3. Comment insérer une macro excel dans une macro word?
    Par max2245 dans le forum VBA Word
    Réponses: 15
    Dernier message: 07/01/2006, 17h44
  4. Réponses: 2
    Dernier message: 07/12/2005, 16h26
  5. [XHTML11] Comment insérer une page externe dans une page ?
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/03/2005, 19h43

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