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 :

Problème d'encodage - UTF8 vers ANSI [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut Problème d'encodage - UTF8 vers ANSI
    Bonjour,

    La mise à jour vers la version 2.24 64 bits continue à poser des problèmes :

    Dans mon projet, je suis amené à créer une base de données avec des champs noms et prénoms. Les noms étant stockés en majuscule et la première lettre des prénoms en majuscule et les autres en minuscule (ce qui fait par une fonction spécifique qui fonctionne bien). Jusqu'à présent, la séquence de code suivante (expl pour le nom) fonctionnait sans problème Laz Util étant dans la options du projet et LazUTF8 dans Uses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TF_Gene.DB_NaissNomEnftExit(Sender: TObject);
     Var NomEnfant : String   ;
    begin
     NomEnfant := Upcase(Utf8ToWinCP(DB_NaissNomEnft.Text)) ;
     DB_NaissNomEnft.text := NomEnfant ;
     DB_NaissPnomEnft.SetFocus ;
    end;
     
    procedure TF_Gene.DB_NaissNomEnftKeyPress(Sender: TObject; var Key: char);
    begin
       if Key = #13 Then  DB_NaissPnomEnft.setFocus ;
    end;
    par exemple si j'entrais comme nom "estÉve" ( le É étant entré par la touche Alt144) je récupérais dans le champ "NomEnfant" de la base "ESTÉVE". Depuis le passage à la version 2.24 il est impossible de traduire en Ansi les entrées faites dans les contrôles qu'il s'agisse du type TDB_edit ou simplement Ed_Edit et que l'on utilise UTF8ToANSi, UTF8ToSys ou UTF8ToWinCp. Actuellemnt je récupère NomEnfant = $000000000E318CB8^: 'EST'#$C9'VE'
    Comment se sortir de ce mauvais pas ?

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    459
    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 : 459
    Par défaut
    Bonjour,

    Pour moi, cela est bon (Un E avec accent encodé en ANSI western European vaut bien C9).
    Ce que tu vois, c'est dans le débogueur? Si oui c'est normal. Que dit ta base de données (avec un autre outil?)

    Personnellement dans mon appli depuis le passage du compilateur à UTF8 qui a fait que les fonctions UTF8toSys sont neutralisées (en leur faisant retourner sans conversion) j’utilise UTF8ToWinCP et WinCPToUTF8.

    Cordialement

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour,

    Dans les TdbEdit c'est même EST?VE qui doit s'afficher. Tout ceci est normal puisque seul l'UTF8 est affiché correctement par Lazarus et que le code $c9 n'est pas un caractère normal en UTF8.
    Pour la liaison à la base, le "CharacterSet" de connexion à utiliser doit être UTF8. Si le champ correspondant dans la base est du WIN1252, le transcodage doit se faire automatiquement, à condition que le caractère existe dans les 2 jeux de caractères.
    UTF8UpperCase devrait suffire pour mettre le nom en majuscules.

    André

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut Affichage et encodage UTF8-Ansi
    Bonjour,

    J'utilise Zeos pour communiquer avec la base de données. Dans le ZC_Naiss la propriété Controlcodepage est bien Ccp-UTF8.
    A l'affichage dans le TBD_Edit j'ai bien EST?VE ainsi d'ailleurs que dans le champ correspondant de la base que j'ai vérifié en utilisant sqliteadmin .
    C'est extrêmemnt génant alors que cela fonctionnait bien avec la version 2.0 32 bits de Lazarus que j'utilisais il n'y a pas si longtemps.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut même problème
    Bonour,

    En complément de ma réponse : j'ai testé l'option UTF8Uppercase (...) . J'ai bien un afichage ESTÉVE mais par contre la récupération dans le champ de la base de données donne : ESTÉVE.
    donc le problème reste entier .

  6. #6
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    459
    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 : 459
    Par défaut
    Ça
    ESTÉVE.
    c'est parce que c'est encodé en UTF8.
    Pour autant que j'ai vu cpp_UTF8 ne fait rien! C'est à dire (si j’ai bien lu car je ne suis pas spécialiste de ZEOS) que ce que as dans ta base, tu le reçois dans ton application.

    Pour info avant d'arriver à la version 2.24 tu venais de quelle version? Car depuis au moins la version 2 c'est comme ceci?

    Donc soit
    * (tu dois connaître ZEOS mieux que moi) tu trouves ce qui te permet un transcodage ANSI en base vers UTF8 sur ton programme
    * tu transforme ta base en UTF8
    * Tu utilises les fonctions UTF8toWincp (de ton programme vers la base) et WinCptoUTF8 (de ta base vers ton programme)

    Il te faut aussi savoir que le codage ANSI dépend de la zone où tu es et que le É se transforme en Iota en Grèce (par exemple)

  7. #7
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour !

    Citation Envoyé par OR34a Voir le message
    En complément de ma réponse : j'ai testé l'option UTF8Uppercase (...) . J'ai bien un affichage ESTÉVE mais par contre la récupération dans le champ de la base de données donne : ESTÉVE.
    donc le problème reste entier .
    Acaumes a tout expliqué. Mais de toutes façons, où est le problème puisque vous savez comment l'afficher correctement dans votre application ?

    bb84000

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut Efectivement le problème n'en n'est pas réellement un
    Bonjour,

    J'ai supprimé toutes les instructions "UTF8toANSi" ou similaires de mon projet et l'affichage dans les formulaires du projet est alors correct quel que soit le caractère concerné. Dan les enregistrements de la base, les caractères accentués et autres continuent de s'afficher avec des codes particuliers, mais en réalité cela ne me gène pas vraiment car, pour communiquer avec mes correspondants j'ai l'obligation de transmettre des fichiers Excel et que, pour cela, j'ai intégré un transfert des tables vers des fichiers CSV et que j'utilise Notepad++ et sa possibilité d'encodage UTF8 vers ANSI pour construire en suite le fichier Excel.
    CE qui me posait problème c'est que dans les versions précédentes j'utilisais les fonction de conversion et que l'affichage était correct, mais bon, le plus simple étant le mieux le problème est résolu.
    Merci pour votre intérêt et vos suggestions.

    R.O.

  9. #9
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Le jeu de caractères par défaut d'une base SQLite3 est UTF8. Lazarus/FPC travaillant en UTF8, vous n'avez effectivement rien à faire. Il est possible que le logiciel avec lequel vous regardez les tripes de la base ne soit pas UTF8, ce qui explique que l'affichage des champs soit bizarre. Essayez avec DB Browser pour SQLite, pour voir.

    bb84000

  10. #10
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    459
    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 : 459
    Par défaut
    Bonjour,

    Citation Envoyé par bb84000 Voir le message
    Le jeu de caractères par défaut d'une base SQLite3 est UTF8.bb84000
    Oui, cela signifie que tout ce qui est traité par SQLite3 doit être en UTF8 (sauf cas particuliers sqlite3_open16 où le nom de la base doit être en UTF16.
    Pour les données textuelles que tu mets dans la base (texte entre guillemets rien n'est vérifié tu peux utiliser le codage que tu désires rien ne se passera (et il n'y a aucune vérification).

    pour communiquer avec mes correspondants j'ai l'obligation de transmettre des fichiers Excel
    As tu essayé avec FPSpreadsheet via OPM par exemple.

    Cordialement

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour,

    Citation Envoyé par bb84000 Voir le message
    Le jeu de caractères par défaut d'une base SQLite3 est UTF8.
    Vous êtes bien sûr de çà?
    Je me suis aussi trompé en répondant précédemment:
    Citation Envoyé par alanglet Voir le message
    Pour la liaison à la base, le "CharacterSet" de connexion à utiliser doit être UTF8. Si le champ correspondant dans la base est du WIN1252, le transcodage doit se faire automatiquement, à condition que le caractère existe dans les 2 jeux de caractères.
    Utilisant habituellement Firebird, je pensais que c'était pareil avec SQLite.
    Mais étonné par la réponse d'acaumes:
    Citation Envoyé par acaumes Voir le message
    Pour autant que j'ai vu cpp_UTF8 ne fait rien! C'est à dire (si j’ai bien lu car je ne suis pas spécialiste de ZEOS) que ce que as dans ta base, tu le reçois dans ton application.
    j'ai consulté la FAQ SQLite https://www.sqlite.org/faq.html#q3
    et j'en conclu que SQLite enregistre dans ses champs "ce qu'on y met" sans aucun transcodage. Il ne le modifie pas, C'est pourquoi OR34a y trouvait du WIN1252 à l'époque où son logiciel travaillait en interne en WIN1252.
    Conclusion annexe: pour transférer des données, une base chargée avec un logiciel Lazarus (UTF8) n'est pas utilisable directement sur un logiciel D7 (WIN1252), à moins de "transcoder" toute la base avant.

    André

    PS: acaumes vient juste de me griller... mais pour compléter sa réponse, il n'est pas sorcier de programmer une exportation en csv en transcodant en WIN1252.

  12. #12
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour alanglet !

    Dans le sujet Opening A New Database Connection

    "The default encoding will be UTF-8 for databases created using sqlite3_open() or sqlite3_open_v2(). The default encoding for databases created using sqlite3_open16() will be UTF-16 in the native byte order."

    Ceci étant, comme vous l'avez dit, dans une base existante, si on y a mis de l'ansi, on retrouvera de l'ansi. Donc si on travaille avec d'anciennes bases où le problème peut arriver, il faut savoir si on est en ansi ou en UTF8, convertir dans le premier cas et ne rien faire dans le second. A moins que cette fonction existe déjà, voici un code qui fait ça (uses LazUTF8 nécessaire) :

    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
    // Convert Ansi string to UTF8 string if string is ansi, do nothing if string is already UTF8
     
    function IsAnsi2Utf8(st: string):string;
    var
      i: integer;
      b1, b2: byte;
    begin
      result:= st;
      // if length (byte) equal to UTF8 char number
      // Then we are in ANSI or pure ASCII
      if Length(st) = UTF8Length(st) then
      begin
        for i := Length(Result) downto 1 do
          if Result[i] >= #127 then
          begin
            b1 := $C0 or (ord(Result[i]) shr 6);
            b2 := $80 or (ord(Result[i]) and $3F);
            Result[i] := chr(b1);
            Insert(chr(b2), Result, i + 1);
          end;
      end;
    end;
    bb84000

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

Discussions similaires

  1. [NotePad++] Extension de conversion UTF8 vers ANSI
    Par xorax dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 19/12/2007, 18h02
  2. Problèmes d'encodage utf8
    Par gvdmoort dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 09/09/2007, 17h32
  3. [MySQL] Problème d'encodage utf8
    Par tomix81 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 25/07/2007, 23h31
  4. Problème d'encodage UTF8
    Par vg33 dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2006, 20h28

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