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 :

Utilisation de ProcessUTF8 [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Par défaut Utilisation de ProcessUTF8
    Bonjour à tous.

    Les caractères accentués sont remplacés par des points d'interrogations
    dans les SQLquery.
    J'ai documenté sur le sujet et j'ai appris qu'il faut assigner ProcessUTF8 à
    CharSet de IBConnection pour les faire apparaitre.
    Mais comment configurer ProcessUTF8?

    merci à tous.

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

    Informations professionnelles :
    Activité : Développeur informatique

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

    Si "Les caractères accentués sont remplacés par des points d'interrogations" c'est simplement parce que Lazarus attend des textes codés en UTF-8, alors que IB comme la plupart des SGBD ne les définissent pas par défaut en UTF-8, d'où ces problèmes récurrents.

    La solution la plus simple, toujours à privilégier si elle est possible, et qui va dans le sens de l'histoire, serait de créer ses bases en UTF-8. Ceci peut se faire sous SQL avec une instruction DEFAULT CHARACTER SET UTF8 derrière CREATE DATABASE ou TABLE
    ou bien interactivement d'une manière qui dépend de ce SGBD. Dans ce cas, il n'y aura jamais rien d'autre à faire, et les programmes fonctionneront avec toutes les langues sur tous les systèmes.

    Si c'est impossible, parce que la base est encore utilisée par des vieux programmes, il y a d'autres solutions :

    L'une d'elle est lourdingue, mais fonctionne et permet de mieux comprendre ce qui se passe : coder chaque chaîne lue par la fonction ISO8859ToUTF8, et chaque chaîne à enregistrer avec la fonction inverse UTF8ToISO8859 de l'unité LazUTF8. Pour les composants orientés données (TDbEdit), cela peut se faire dans les événements OnGetText/OnSetText des champs.

    La solution nominale et optimale est plutôt de se débrouiller pour faire faire la conversion automatiquement, par des pilotes adhoc, soit par la configuration du SGBD, soit par les composants d'accès aux données. Le principe de base est de spécifier des jeux de caractères distincts pour le serveur et le client. Mais dans le cas d'Interbase, je ne sais pas comment on fait, désolé.

  3. #3
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Par défaut
    Bonjour

    merci pour votre aide Tintinux.

    J'ai testé les deux fonctions:ISO8859ToUTF8() et UTF8ToISO8859() mais elles ne sont pas reconnues par Laz.
    Les deux fonctions reconnues sont UTF8Decode() et UTF8Encode().
    Cependant le code suivant n'a donné aucun changement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure FamillePrdsLIBELLE_CTGGetText(Sender: TField;
      var aText: string; DisplayText: Boolean);
    begin
     aText:=UTF8Decode(FamillePrdsLIBELLE_CTG.Value) ;
     DisplayText:=True;
    end;
    ou est l'erreur?

    merci.

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    d'où vient ton ProcessUTF8 ? ne serait pas plutôt UTF8 qui est utilisé comme ceci par exemple :

    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
    19
    20
    21
    22
    const
      // Name for the database. Be sure to specify the same name in your database.ini
      DatabaseFile = 'test.fdb'; //Sensible name for a test database, right?
    var
      Fire: TIBConnection;
     
    begin
      //Connection to Firebird database
      // The next line is needed for quite old FPC versions
      // Newer versions will first look for fbembed.dll in the application directory automatically
      //UseEmbeddedFirebird:=true; // Using embedded (and fbembed.dll) or regular client/server (fbclient.dll), requires ibase60dyn in uses
      Fire:=TIBConnection.Create(nil);
      try
        Fire.HostName := ''; //must be empty for embedded Firebird; must be filled for client/server Firebird
        Fire.DatabaseName := DatabaseFile; //(path and) filename
        // Username and password do not matter for authentication, but you do get authorizations in the database
        // based on the name (and optionally role) you give.
        Fire.Username := 'SYSDBA';
        Fire.Password := 'masterkey'; //default password for SYSDBA
        Fire.Charset := 'UTF8'; //Send and receive string data in UTF8 encoding
        Fire.Dialect := 3; //Nobody uses 1 or 2 anymore.
        Fire.Params.Add('PAGE_SIZE=16384'); //I like a large page size (used when creating a database). Useful for larger indexes=>larger possible column sizes
    Ami calmant, J.P

  5. #5
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Par défaut
    Salut J.P et merci pour votre aide.

    J'ai préféré l'idée de Tintinux qui est vraiment fructueuse en améliorant le code précédent en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure FamillePrdsLIBELLE_CTGGetText(Sender: TField;
      var aText: string; DisplayText: Boolean);
    begin
      aText:=SysToUTF8(FamillePrds.FieldValues['LIBELLE_CTG']);
      DisplayText:=True;
    end;
    Merci à vous tous
    et chapeau à Tintinux

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Par défaut
    Ravi que vous ayez résolu votre problème.

    En fait, j'avais manqué de précision : ce sont plutôt les fonctions de l'unité LConvEncoding qu'il faut utiliser;
    Probablement ISO_8859_15ToUTF8 et son inverse, sachant que l'ISO8859_15 c'est un des jeux de caractère le plus répandu (_15 permet de coder le signe "€", ce que ne fait pas _1).
    Pour être parfaitement rigoureux, il faut prendre exactement le jeu de caractère utilisé pour coder votre base de données existante.

    SysToUTF8 permet lui de traduire automatiquement depuis le jeu de caractère utilisé par le système d'exploitation courant, qui est l'ISO8859_15 sur beaucoup de versions de Windows.
    Donc ça fonctionne sûrement très bien aussi, mais si vous faites une version de votre programme pour Linux, OSX ou autre, en lisant la même base de données, ça n'ira plus...
    Cette fonction est faite uniquement pour convertir les noms de fichiers et de dossiers du système, en vue de les afficher en UTF8.

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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