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 :

[1.0.4/Win XP] Caractères spéciaux dans base de données [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut [1.0.4/Win XP] Caractères spéciaux dans base de données
    Bonjour,

    je dispose d'une table dbf issue d'un vieux programme développé avec Delphi. Quand je cherche à y accéder par un programme fait avec Lazarus, les carctères spéciaux (accents, ° par exemple) ne sont pas reconnus.

    Y a-t-il un moyen simple de transformer le codage de l'ensemble de la base pour l'utiliser sous Lazarus ?

    Ma seule idée (me semblant un peu lourde) : créer une autre table de structure identique, lire la base initiale enregistrement par enregistrement, transcoder UTF/Ansi (voir mon post précédent sur les problèmes d'accents dans les noms de fichier) tous les champs pouvant poser problème, puis insérer l'enregistrement dans la nouvelle table ...

    (avec cette méthode impossible de partager les données avec une autre appli codée en delphi par exemple).

    Cordialement.

  2. #2
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Si je me rappelle bien, dans un fichier DBF les chaînes sont en ANSI, mais il y a aussi des données binaires pour stocker les nombres notamment. Il est donc exclu d'encoder le fichier globalement, car l'encodage ne concerne que les chaînes.

    Il suffit pour chaque enregistrement, d'encoder avec ANSItoUTF8 chaque champ chaîne lu avant de l'afficher sous Lazarus (et éventuellement l'inverse avec UTF8ToANSI pour l'enregistrer dans le fichier DBF).

    Cela peut parfaitement être fait "à la volée", si tu veux partager les données avec une vieille application et c'est très peu consommateur.

    Je te conseillerais quand même de passer à autre chose, car les fichiers DBF, qui ont quand même plus de 30 ans, vont être de moins en moins supportés. Tu peux exporter ton fichier DBF en délimité et le relire dans un fichier SqlLite, ou dans une table MySql ou autre.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    je dois avouer que je ne sais pas trop comment faire pour encoder "à la volée" un champ avant de l'afficher. J'ai fait différents essais notamment dans l'événement OnDataChange d'un Datasource mais rien de concluant ...

    Passer à autre chose ... c'est effectivement également une de mes pistes de réflexion. Je teste en ce moment Sqlite mais je rame pas mal pour l'instant !

    PS : j'ai constaté un truc bizarre, j'ai le signe ° dans ma base qui n'est pas reconnu mais après encodage, je ne le retrouve pas, il est remplacé par un petit rond barré en position basse !

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Si tu utilises une table ou une query liée à une datasource, c'est l'événement OnGetText qui permet de modifier ce que tu lis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFormImport.StringOnGetText(Sender: TField; var aText: string;
      DisplayText: boolean);
     
    begin
       aText := ANSIToUTF8(Sender.AsString);
    end;
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Merci, j'ai compris, le OnGetText du champ concerné ...

    En revanche, l'encodage ne fonctionne pas. Je n'ai plus les ? à la place des caractères posant problème mais :

    ø au lieu de °
    , au lieu de é
    ... au lieu de à

    Cordialement.

  6. #6
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bon, alors c'est sans doute que les chaînes que tu soumets à AnsiToUtf8 ne sont pas encodées en ANSI.

    Il peut y avoir plusieurs raisons, il va falloir chercher...

    DBase emploie peut être un autre jeu de caractères, j'avoue que j'ai totalement oublié ce produit.

    Ou alors, l'interface que tu utilises pour lire le fichier DBF (laquelle est-ce ?) effectue déjà un encodage. Pour certaines bases de données et certains pilotes, on peut spécifier un encodage "automatique", mais je ne sais pas si cela te concerne.

    Ou alors enfin il y a, dans l'un des deux cas ci-dessus, un encodage qui n'est pas conforme à la norme, ça s'est déjà vu.

    Tu pourrais essayer d'exporter ton fichier en délimité en utilisant dBase si tu l'as, ou avec Delphi, ou avec Lazarus sans encoder. Ensuite ouvrir ce fichier "plat" avec Lazarus, et regarder avec clic-droit, paramètres fichier, encodage quel est l'encodage deviné. Eventuellement faire la même chose avec PsPad pour confirmer.

    Courage, il n'y a pas que toi qui as des soucis avec ce sujet !
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    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 : 420
    Points : 1 097
    Points
    1 097
    Par défaut
    Bonjour,

    A voir les caractères, je pense qu'il s'agit d'un codage OEM (c'est à dire codage utilisé avec DOS (et que l'on retrouve encore dans les boites de commandes DOS)

    Cordialement

  8. #8
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Je pense que c'est cela, en effet. Les fichiers dBase datent des années 80 alors ANSI/UTF8... C'est du codage DOS.
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Pour préciser : j'en suis resté à delphi 2 (Version Développeur pour avoir l'accès aux BD) et j'ai des tables Paradox (crées avec l'outil fourni avec delphi).

    Comme je souhaite passer à Lazarus (2 motivations principales : outil plus récent et possibilité de porter sous Linux), j'ai, pour pouvoir faire des tests, transféré une de mes tables (celle avec laquelle je découvre ce problème de jeux de caractères !) en table DB grâce au composant TBatchMove. Ceci afin de pouvoir accéder à cette table sous Lazarus avec le composant TDbf ...

    Si cela aide à comprendre comment elles sont codées ... je croyais que OEM et ANSI, c'était la même chose !

    Merci à tous pour vote aide.

  10. #10
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    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 : 420
    Points : 1 097
    Points
    1 097
    Par défaut
    Bonjour,

    Pas tout à fait.

    Le codage OEM a été mis en œuvre avec DOS (à partir de la version 2 je crois)

    Le codage ANSI lui est arrivé avec Windows.

    Vois cette discussion ... http://www.developpez.net/forums/d10...ansi-vers-oem/

    LA table de trans-codification complète : http://profgeii.free.fr/explorer/ii1/ASCII.pdf

    Windows fournit des routines pour convertir OEM vers Ansi (OemToAnsi) qui sont reprises dans l'unité Windows

    Cordialement

  11. #11
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par acaumes Voir le message
    Windows fournit des routines pour convertir OEM vers Ansi (OemToAnsi) qui sont reprises dans l'unité Windows
    Dans l'unité Windows de Delphi ? Il n'y pas de telle unité dans Lazarus.

    En fait le terme OEM est assez générique, mais si je ne me trompe l'OEM français s'appelle CP 850. Donc la fonction CP850ToUTF8 de Lazarus (unité LConvEncoding) devrait faire l'affaire.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Cela doit bien être du CP850 car avec CP850ToUTF8, cela marche, enfin presque !!!

    Avec : aText := CP850ToUTF8(Sender.AsString);
    dans l'événement OnGetText d'un champ de type texte (TstringField), j'arrive à retrouver la bonne écriture.

    En revanche, j'obtiens un résultat insatisfaisant pour les champs TMemoField : dans une grille, au lieu d'avoir "(MEMO)", j'ai le texte corrigé avec 2 petits carrés pour chaque retour à la ligne. Mais aucun changement pour l’affichage du champ dans un TDBMemo.

  13. #13
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    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 : 420
    Points : 1 097
    Points
    1 097
    Par défaut
    Bonjour,

    L'unité Windows est dans la rtl de fpc, pas dans Lazarus mais c'est presque la même chose

    This file is part of the Free Pascal run time library.
    This unit contains the record definition for the Win32 API
    Copyright (c) 1999-2000 by Florian KLaempfl,
    member of the Free Pascal development team.

    Par contre je ne connaissais pas les routines que tu cites. je vais regarder.

    Cordialement

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/06/2011, 14h18
  2. insertion caractères spéciaux dans base ACCESS
    Par Titiii25 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 24/11/2009, 10h16
  3. [MySQL] Caractères accentués dans base de données MySQL
    Par enfin dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/01/2007, 20h54
  4. caractère spéciaux dans nom de base
    Par slefevre01 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/08/2005, 17h41
  5. [XML] caractères spéciaux dans un type NMTOKEN
    Par norkius dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 08/09/2004, 14h30

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