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

Lazarus Pascal Discussion :

Encodage de caractères pour OO Automation [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Par défaut Encodage de caractères pour OO Automation
    Bonjour.

    J'ai toujours trouvé très compliqués et pénibles à gérer les problèmes d'encodage de caractères (gestion des caractères accentués, ...).
    Aujourd'hui, j'y suis à nouveau confronté dans le cadre d'un essai d' "automation" de OpenOffice writer. Quand je cherche par exemple à insérer 'Première ligne de texte', le è n'est pas bien affiché, cela donne "è" à la place.

    Cela fait un moment que je tourne en rond en lisant tout ce que je trouve sur le sujet (UTF8, Ansi, widestring, ....) mais rien n'y fait.
    Si quelqu'un a la solution ...

    Christian

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 251
    Par défaut
    hello,
    essaie un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      // S : String;  xText := Document.GetText;
     
     
      xTextCursor := xText.CreateTextCursor;
      S :=  'Première ligne de texte';
      xText.InsertString(xTextCursor, WideString(UTf8toAnsi(S)) , False);
    Ami calmant, J.P

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Par défaut
    Bonjour.

    J'avais essayé les 2 (UTf8toAnsi et widestring) mais je n'avais pas pensé à les "enchaîner". Et ça marche !
    Merci.

    Mais j'aimerais bien comprendre ... Sais-tu s'il y a quelque part un dossier clair expliquant tous les problèmes liés à l'encodage ?

    Christian

  4. #4
    Membre chevronné

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Par défaut
    Bonjour,

    "... tous les problèmes liés à l'encodage ...", j'en doute, compte tenu de l'ampleur du sujet.

    Par contre, il existe toute une série de règles et de conventions, qui fait que l'on peut en général facilement déterminer ce qu'il est nécessaire de faire; si tant est qu'il faille faire quelque chose.

    Dans votre cas:
    - toutes les API COM/OLE de Windows utilisent des strings de type Unicode uniquement (i.e. UTF16, enfin presque) ,
    - la LCL de Lazarus utilise des strings de type UTF8 par défaut.

    Il faut donc convertir les types de string pour passer de l'un à l'autre.

    Ceci étant, cela doit normalement se faire de façon assez simple, surtout depuis l'ajout du support amélioré de l'Unicode dans Free Pascal (i.e. compilateur FPC 3.x). Donc, théoriquement dans votre cas:
    - LCL ---> OLE: WideString(MyLCLString)
    - OLE ---> LCL: String(MyOLEString) (ou éventuellement UTF8String(MyOLEString)).

    En fait, même sans cela le compilateur effectue bien souvent (mais pas toujours) la conversation lui-même automatiquement si vous l'oubliez, avec alors un warning lors de la compilation.


    Donc "normalement", pour reprendre l'exemple de jurassic pork, ceci "aurait" du fonctionner (le transcodage à partir du code page UTF8 se fait en effet automatiquement sans aucun problème):
    Code PASCAL : Sélectionner tout - Visualiser dans une fenêtre à part
    xText.InsertString(xTextCursor, WideString(S) , False);


    Je suis donc très surpris que cela n'ait pas fonctionné. Question (qui concerne d'ailleurs tout autant jurassic pork): pourquoi ?


    Je précise cependant que cela concerne uniquement le cas: LCL et OLE. J'ai en effet supposé que vous utilisiez la LCL, puisque vous avez posté dans le forum Lazarus (et pas le forum Free Pascal).

    Si votre programme est de type "FPC sans LCL" et que utilisez l'EDI Lazarus par exemple, alors dans ce cas les choses "se compliquent" et la nécessité du transcodage manuel est effective (ou bien alors il faut changer le type d'encodage du code source).

  5. #5
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 458
    Par défaut
    Bonjour,

    Donc "normalement", pour reprendre l'exemple de jurassic pork, ceci "aurait" du fonctionner (le transcodage à partir du code page UTF8 se fait en effet automatiquement sans aucun problème):
    Tout dépend de la version de Lazarus/freepascal (non indiquée dans par le PO) depuis la lazarus 1.6 (en fait FPC 3.0) (je crois) ansitoutf8 n'a aucun effet mais avant comme lazarus était UTF8 et Freepascal en ANSI, il fallait cette fonction pour passer de UTF8 vers ANSI.

    Cordialement

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Par défaut Précisions
    Bonjour.

    J'utilise Lazarus 1.8.0 avec FPC 3.0.4
    et je crée une application graphique (Nouveau/Projet/Application)

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myText.InsertString(myCursor, 'Première ligne de texte', false);
    le è n'est pas bien affiché, cela donne "è" à la place.

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myText.InsertString(myCursor, widestring('Première ligne de texte'), false);
    idem

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myText.InsertString(myCursor, UTf8toAnsi('Première ligne de texte'), false);
    la ligne ne s'affiche pas dans writer (aucun caractère)

    Avec la solution de jurassic pork :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myText.InsertString(myCursor, widestring(UTf8toAnsi('Première ligne de texte')), false);
    cela fonctionne ! La ligne s'affiche correctement.

    Je ne sais pas si je dois mettre le sujet en "Résolu" puisque j'ai la réponse à mon problème ... mais je n'ai pas vraiment compris pourquoi il faut faire cela !

    Merci à tous.

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

Discussions similaires

  1. [Drupal] L'encodage des caractères est "coupé" pour les résumés
    Par Samy-DT dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 30/12/2015, 11h05
  2. [Mail] Encodage des caractères pour les mails
    Par Cr@zyDeep dans le forum Langage
    Réponses: 2
    Dernier message: 29/03/2007, 20h11
  3. result: chaine de caractère pour une DLL
    Par Sephiroth Lune dans le forum Langage
    Réponses: 7
    Dernier message: 27/07/2004, 23h05
  4. Réponses: 9
    Dernier message: 30/06/2004, 23h19

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