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

WinDev Discussion :

Lire un fichier UTF-8 [WD12]


Sujet :

WinDev

  1. #1
    Membre actif Avatar de MicaelFelix
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 254
    Points : 221
    Points
    221
    Par défaut Lire un fichier UTF-8
    Bonjour,

    Voici mon problème :
    Je veux lire du Grec à partir d'un fichier UTF-8.
    Le fichier est composé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Langage
    -1
    1
    Mon texte
    2
    Mon texte
    ...
    La première ligne donne le nom du langage qui va être décrit dans le fichier.
    La seconde ligne donne l'entier qui sert à la fonction ChangeAlphabet pour afficher correctement les caractères en mode ANSI (ce qui me permet de ne pas avoir à mettre tous mes champs en Unicode).
    Puis dans une boucle je remplis un tableau associatif tout simplement comme ceci :
    TableauTraduction[1]=Mon texte
    Je veux afficher cela à l'écran à la fin.

    Sans UTF-8, ça se passe très bien, mais pour des raisons pratiques, notament de transfert de fichier de traduction par email, je me dois de le mettre en UTF-8 pour simplifier les échanges et pour que je puisse ouvrir le fichier et voir le contenu sans passer par mon application.

    Le problème est que je dois lire ce fichier par mon application WinDev, et ça, ça ne marche pas.

    J'ai beau ouvrir mon fichier avec :
    fOuvre("Language_GR.txt",foLecture+foUnicode)

    Les chaines retournées par fLitLigne ne sont pas des chaines Unicode
    Je dis cela car si j'essaye de faire
    chaineNonUTF8 = UnicodeVersAnsi(fLitLigne(nFichier))
    J'ai le droit à une erreur "Un élément de type chaîne ne peut pas être converti vers le type chaîne UNICODE."
    Bref, la conversion de la chaine renvoyée par fLitLigne échoue car elle ne semble pas être du bon type.

    Pourtant UTF-8 c'est bien du Unicode, non?

    Si j'essaye avec UTF8VersChaîne cela ne bug pas (pourquoi? la chaine chaineNonUTF8 n'est pas Unicode et aucun cas n'est effectué donc cela devrait bugger comme l'autre fonction) mais cela me donne une valeur qui n'a rien à voir.
    Par exemple j'obtiens "4" alors que ma première ligne du fichier contient "Greek".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ResOuverture est un entier =  fOuvre(ComplèteRep(fRepExe())+"Language_"+gbTraduction_Langue+".txt",foLecture)
    
    Ligne = UTF8VersChaîne(fLitLigne(ResOuverture))
    SI Ligne=EOT ALORS RETOUR //En mode débug Ligne n'a aucun rapport avec la valeur réelle
    Bien entendu le fichier est correctement enregistré en UTF-8 car quand je tente de l'ouvrir Windows (7) me demande dans quel encodage je veux le voir et il me propose automatiquement UTF-8 qui est le bon mode d'encodage car je vois les bons caractères.

    De plus si j'essaye une ouverture "simple" du fichier (sans le +foUnicode) cela me met des caractères bizarres un peu partout (mais ça c'est normal vu que le fichier est encodé différemment).

    Quelqu'un aurait une idée? Est-ce que j'ai mal compris quelque chose?
    Au pire je garde tout Ansi mais c'est chiant car je vais à chaque fois devoir passer par mes utilitaires pour manipuler les fichiers (car dans le cas contraire sinon on ne voit pas correctement les caractères).

    Et dans le futur je souhaiterai utiliser ces fichiers au niveau du web donc UTF-8 est vraiment la solution standardisée à ce niveau là.

    À bientôt,

    Micaël

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Sous toute réserve, je pense que quand WinDev gère du texte UNICODE, il fonctionne à l'instar des API Windows UNICODE, c'est à dire en UTF-16.

    Si c'est vrai, alors il est inutile d'ouvrir un fichier UTF-8 avec foUnicode car ce n'est pas approprié.

    Sur le principe du traitement d'un fichier UTF-8:

    (1) lire les lignes de façon classique (vers une chaîne de caractères "standard"),
    (2) attention, peut-être y-a-t-il une séquence "d'octets entête" en début de fichier qu'il faudra éliminer ?
    (3) pour chaque ligne lue il faut la "traduire" en ANSI ou en UNICODE/UTF-16; donc tu exécutes la fonction UTF8VersChaine() dont le résultat est affecté à une chaine UNICODE (par exemple), ou placé dans le champ qui convient.

    Une tentative de code...
    Code WLangage : 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
    23
    24
    25
    26
    nIdFic est un entier
    sLigne est une chaîne
    sFinal est une chaîne UNICODE
     
    // Ouverture du fichier
    nIdFic = fOuvre(sFichier, foLecture)
     
    SI nIdFic = -1 ALORS
        Erreur("L'ouverture du fichier a échoué", ErreurInfo())
    SINON
        // Première ligne
        sLigne = fLitLigne(nIdFic)
     
        TANTQUE sLigne<>EOT
            sFinal = UTF8VersChaîne(sLigne, alphabetUTF8)
     
            // Traitement de la ligne lue
            Trace(sLigne, sFinal)
     
            // Ligne suivante
            sLigne = fLitLigne(nIdFic)
        FIN
     
        // Fermeture du fichier
        fFerme(nIdFic)
    FIN

  3. #3
    Membre actif Avatar de MicaelFelix
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 254
    Points : 221
    Points
    221
    Par défaut
    Merci pour ta réponse

    En fait j'ai trouvé une manière de faire fonctionner ça.

    test.txt est un fichier enregistré en Unicode (par notepad).
    La fenêtre doit avoir utilisé le changealphabet correspondant avant d'afficher quoi que ce soit.

    En fait c'est utiliser unicode pour la source de données, sans l'utiliser pour l'affichage.

    Voici le code fonctionnel :
    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
    23
    24
    25
    nIdFic est un entier
    sLigne est une chaîne
     
    // Ouverture du fichier
    nIdFic = fOuvre("test.txt", foLecture+foUnicode)
     
    SI nIdFic = -1 ALORS
    	Erreur("L'ouverture du fichier a échoué", ErreurInfo())
    SINON
    	// Première ligne
    	sLigne = fLitLigne(nIdFic)
     
    	TANTQUE sLigne<>EOT
    		//sFinal = UTF8VersChaîne(sLigne, alphabetUTF8)
     
    		// Traitement de la ligne lue
    		LIB_Libelle..Libellé+=sLigne+RC//+sFinal+rc
     
    		// Ligne suivante
    		sLigne = fLitLigne(nIdFic)
    	FIN
     
    	// Fermeture du fichier
    	fFerme(nIdFic)
    FIN
    Je vais essayer de voir si c'est possible d'afficher du 100% unicode dans les champs, je sais qu'en théorie c'est possible (y'a les options pour).

  4. #4
    Membre actif Avatar de MicaelFelix
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 254
    Points : 221
    Points
    221
    Par défaut
    Après quelques courts essais je n'ai toujours pas trouvé la solution "Unicodienne" parfaite.
    De la manière dont j'ai réussi, pour que ça marche, il faut absolument être sur le alphabet (avec "ChangeAlphabet"), mais moi j'ai besoin d'afficher un champ avec du contenu multilingue...
    Je sens que je vais embêter mon p'tit support technique gratuit quand j'aurais reçu la version 14 demain. Peut être que c'est un bug de la 12? J'en doute mais bon on ne sait jamais.
    Ah les encodages, ma passion

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Citation Envoyé par MicaelFelix Voir le message
    Après quelques courts essais je n'ai toujours pas trouvé la solution "Unicodienne" parfaite.
    De la manière dont j'ai réussi, pour que ça marche, il faut absolument être sur le alphabet (avec "ChangeAlphabet"), mais moi j'ai besoin d'afficher un champ avec du contenu multilingue...
    Dans l'exemple que je t'ai donné, je n'ai pas eu de souci d'affichage de contenu multilingue (afficher simultanément des caractères provenant d'alphabets grec + hébreu + arabe + latin, comme peut le faire le Bloc-Notes de Windows).

    Deux précisions:

    (1) Avant d'ouvrir la fenêtre où le texte sera affiché, j'exécute:

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    ChangeAlphabet(alphabetUTF8)

    (2) Pour le champ de saisie où le texte est affiché, dans la description du Champ, onglet Général, j'ai coché l'option "unicode".


    Si tu veux, tu pourrais nous donner un exemple de fichier UTF-8.

    Nous aussi, on adore encoder !
    _

  6. #6
    Membre actif Avatar de MicaelFelix
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 254
    Points : 221
    Points
    221
    Par défaut
    Bon donc j'ai enfin réussi à faire fonctionner ça en 20 minutes, apparemment cet essai était plus fructueux que les précédents.

    Je me suis servi de l'approvisionnement par fichier Unicode dans deux cas :
    1. Le cas d'une application qui lit un fichier UTF-8 vers des champs windev standards (mais ayant le même charset), bref très utile lorsqu'on ne veut RIEN modifier dans notre interface (mon cas précisément car je n'ai pas envie de refaire chacune de mes fenêtres) mais qu'on veut pouvoir lire des fichiers UTF-8
    2. Le cas d'une application qui lit un fichier UTF-8 de multiples charset (de l'UTF-8 100% mélangé) vers des champs windev Unicode

    Voici les deux codes générés, ils semblent bien fonctionner du premier coup.

    Le besoin d'avoir une "chaine Unicode" est présent lorsqu'on veut capturer des données non liées à l'alphabet courant de l'application (cas du second exemple) et (bien sûr) provenant d'un fichier Unicode.


    Premier exemple (Sai_step1,Sai_step2 sont des champs de saisie Non Unicode):
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    SAI_Step1=""
    SAI_Step2=""
    nFichier est un entier
    sLigne est une chaîne
     
    sFichierCopié est une chaîne = "copie.txt"
    fCopieFichier("original.txt",sFichierCopié)
     
    //Lecture
    nFichier = fOuvre(sFichierCopié,foLecture+foUnicode)
    BOUCLE
    	sLigne = fLitLigne(nFichier)
    	SI sLigne=EOT ALORS SORTIR
    	SAI_Step1+=((SAI_Step1="")?"" SINON RC) + sLigne
    FIN
    fFerme(nFichier)
     
    // Vidage du fichier
    fCrée(sFichierCopié)
     
    // Écriture avec ce qui a été reçu
    nFichier = fOuvre(sFichierCopié,foEcriture+foUnicode)
    fEcrit(nFichier,AnsiVersUnicode(SAI_Step1))
    fFerme(nFichier)
     
    //Relecture
    nFichier = fOuvre(sFichierCopié,foLecture+foUnicode)
    BOUCLE
    	sLigne = fLitLigne(nFichier)
    	SI sLigne=EOT ALORS SORTIR
    	SAI_Step2+=((SAI_Step2="")?"" SINON RC) + sLigne
    FIN
    fFerme(nFichier)
    Second cas (Sai_saisie1 est un champ Unicode):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    nFichier est un entier
    sLigne est une chaîne UNICODE
     
    sFichierCopié est une chaîne = "copie.txt"
     
    //Lecture
    nFichier = fOuvre(sFichierCopié,foLecture+foUnicode)
    BOUCLE
    	sLigne = fLitLigne(nFichier)
    	SI sLigne=EOT ALORS SORTIR
    	SAI_Saisie1+=((SAI_Saisie1="")?"" SINON RC) + sLigne
    FIN
    fFerme(nFichier)
    Merci =JBO= pour ton soutient

    Je vais intégrer tout ça dans mon application demain, ça devrait fonctionner parfaitement.

    Je regrette presque d'avoir acheté WDMSG parce que je vais rester avec mon système de traduction "maison" pour mon logiciel.
    Car WDMSG est loin d'apporter toutes les fonctions requises dont j'ai besoin

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

Discussions similaires

  1. [SHELL] Lire un fichier au format UTF-16
    Par Cj_Dal dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 05/06/2013, 12h39
  2. Lire fichier UTF 16 LE
    Par zibzab dans le forum Débuter
    Réponses: 13
    Dernier message: 26/04/2013, 13h32
  3. Lire un fichier UTF-8 line par line en C
    Par freeseif dans le forum Windows
    Réponses: 9
    Dernier message: 25/01/2010, 16h44
  4. Lire un fichier en UTF-8 et afficher son contenu
    Par Alghero dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/10/2009, 11h36
  5. Lire un fichier XML UTF 8
    Par rob2-9 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/08/2008, 21h07

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