PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Charger un fichier texte Ansi ou UTF8
Charger un fichier texte Ansi ou UTF8
Débuté par Xavlod, 06 nov. 2020 10:05 - 11 réponses
Membre enregistré
31 messages
Popularité : +1 (1 vote)
Posté le 06 novembre 2020 - 10:05
Bonjour,
Je dois charger un fichier texte qui peut être codé soit en ansi soit en utf8 selon sa provenance que je ne maitrise pas.
Je suis à chaque fois embêté par les accents.

J'avais cru lire que fChargeTexte détectait automatiquement le format, mais aujourd'hui je n'arrives pas à retrouver cette précision dans l'aide de windev.

J'ai trouvé cette solution, mais elle est loin d'être élégante :
snomfic est une chaîne = "TEST UTF8 ou Ansi.txt"
s est une chaîne = fChargeTexte(snomfic)


SI Position(s,"é") > 0 _OU_ Position(s,"è") > 0 ALORS // é ou è
SAI_Direct_unicode = fChargeTexte(snomfic) // SAI_Direct_unicode est un champ de saisie unicode tampon
s = SAI_Direct_unicode
FIN
SAI_Ansi = s


avez vous une meilleur solution ?
Membre enregistré
3 882 messages
Popularité : +227 (347 votes)
Posté le 06 novembre 2020 - 11:08
Bonjour,
La détection automatique n'est valable que pour les applications destinées à Windows Mobile




--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
31 messages
Popularité : +1 (1 vote)
Posté le 06 novembre 2020 - 11:12
Merci de la précision, je pensais avoir la berlue.
Du coup, comment procéderais tu dans ce cas ?
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 09 novembre 2020 - 09:57
Bonjour,

Une solution serait d'examiner la valeur ASCII de chaque caractère pour y rechercher des valeurs comme 185 194 195 ... A affiner...

--
Cordialement
François
Membre enregistré
2 571 messages
Popularité : +222 (260 votes)
Posté le 09 novembre 2020 - 10:06
Bonjour,

@Xavlod: As-tu essayé en passant par fOuvre() pour voir s'il ne détecte pas automatiquement l'encodage du fichier ?

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
3 882 messages
Popularité : +227 (347 votes)
Posté le 09 novembre 2020 - 10:47
Pour rebondir sur la remarque de Philippe, dans la doc de fouvre on peut lire :
fOuvre(<Nom du fichier>, foLecture + foUnicode) : permet d'ouvrir un fichier Unicode. Si la marque "Unicode courant" (FFFE) est trouvée au début du fichier, elle est automatiquement lue.

1-Si tu ouvres ton fichier en Unicode alors que c'est de l'ANSI, il ne trouvera pas la marque il faut tester s'il interprète le fichier en ANSI
2-Une autre solution consisterait à lre les 2 premiers octets et à vérifier s'ils valent FFFE. Si ce n'est pas le cas, c'est de l'ANSI, sinon, il y a une forte probabilité que ce soit de l'Unicode (Il reste toujours le cas du fichier ANSI qui commence par FFFE. Quand on n'a pas de chance ....)

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
31 messages
Popularité : +1 (1 vote)
Posté le 09 novembre 2020 - 15:54
Merci pour vos contributions.

fOuvre comme fChargeTexte nécessitent de connaitre à l'avance le codage du fichier texte.

J'ai donc créé une méthode qui se charge de sélectionner le bon encodage et qui renvoie le résultat en ANSI :


Procedure fcharge_Fichier_Ansi_UTF8_Unicode(snomfic) : chaîne

bufChaineTemp est un Buffer
sChaineDécodée est une chaîne
nIDFichier est un entier

nIDFichier = fOuvre(snomfic, foLecture)
SI nIDFichier <> -1 ALORS
bufChaineTemp = fLit(nIDFichier,2)
SI bufChaineTemp = Caract(255) + Caract(254) // FFFE marque de l'unicode
fFerme(nIDFichier)
nIDFichier = fOuvre(snomfic, foLecture+foUnicode)
bufChaineTemp = fLit(nIDFichier,fTaille(snomfic))
sChaineDécodée = UnicodeVersAnsi(bufChaineTemp,alphabetDéfaut,"?")
SINON
bufChaineTemp = fLit(nIDFichier,fTaille(snomfic))
SI Position(bufChaineTemp,"é") > 0 _OU_ Position(bufChaineTemp,"è") > 0 ALORS //é ou è
//UTF8
sChaineDécodée = UTF8VersAnsi(bufChaineTemp)
SINON
sChaineDécodée = bufChaineTemp
FIN
FIN
SINON
sChaineDécodée = ""
FIN

RENVOYER sChaineDécodée



*** Problème résolu ***
Posté le 10 juin 2022 - 11:27
Beau travail !

merci, ça m'a fait gagner pas mal de temps...

Eric
Membre enregistré
3 333 messages
Popularité : +93 (137 votes)
Posté le 10 juin 2022 - 17:39
Je suis désolé mais la solution proposée ne fonctionne pas dans tous les cas de figure
Il arrive en effet qu'un fichier Unicode n'est pas les 2 caractère
Le code ne prend que le cas du français
Si le fichier contient des caractères non latin ex arabe, hébreu, chinois Etc
Alors il ne fonctionne pas
Le plus simple c'est de faire comme excel qui demande à l'utilisateur quel
Format choisir.
Membre enregistré
102 messages
Popularité : +4 (4 votes)
Posté le 27 septembre 2022 - 14:46
Je propose ceci :

texte est une chaîne= fChargeTexte("fichier.txt")
sCarac est une chaîne = Gauche(texte,1)
SI sCarac = "ÿ" ALORS
sTemp2 est une chaîne UNICODE = fChargeBuffer("fichier.txt")
// "---UNICODE---"
RENVOYER sTemp2
FIN
tabCaracs est un tableau de chaînes = ["é","è","ë","ê","é","ã","à","â","ü","ù","ï","ô","õ","ö"]
sTemp est une chaîne = UTF8VersAnsi(texte)
nPosition est entier = Position(sTemp,"?")
nPositionTotale est entier = nPosition
TANTQUE nPosition>0
sCarac = Milieu(texte,nPositionTotale,1)
SI TableauCherche(tabCaracs,tcLinéaire,sCarac)<>-1 ALORS
// "---ANSI---"
RENVOYER texte
FIN
sTemp = Droite(sTemp,Taille(sTemp)-nPosition)
nPosition = Position(sTemp,"?")
nPositionTotale += nPosition
FIN
//"---UTF8---"
RENVOYER UTF8VersAnsi(texte)

pour les caractères non latins, on peut les ajouter dans tabCaracs
Membre enregistré
3 333 messages
Popularité : +93 (137 votes)
Posté le 27 septembre 2022 - 15:15
Désolé dav,
Je me vois mal rajouter 65000 caractéres
Cdt
Membre enregistré
102 messages
Popularité : +4 (4 votes)
Posté le 13 octobre 2022 - 12:39
Il y avait une erreur, voici mon nouveau test pour toujours sortir de l'unicode :
sCarac est une chaîne = Gauche(texte,1)
SI sCarac = "ÿ" ALORS
sTemp2 est une chaîne UNICODE = fChargeBuffer("utf16.txt")
//"---fichier UNICODE---"
RENVOYER sTemp2
FIN
tabCaracs est un tableau de chaînes = ["é","è","ë","ê","é","ã","à","ü","ù","ï","ô","õ","ö"]
sTemp est une chaîne UNICODE = UTF8VersAnsi(texte)
SI Position(sTemp,"?")>0 ALORS
SI Position(texte,"?")=0 ALORS
LIB_unicode_Ansi = "---ANSI---"+RC+texte
RETOUR
FIN
i est entier = 1
nNb est entier = Taille(texte)
sCara est chaîne
TANTQUE i<=nNb
sCara = Milieu(texte,i,1)
SI sCara<>"?" ET UTF8VersAnsi(sCara)="?" ALORS
SI Cherche(tabCaracs,tcLinéairePremier,sCara)>0 ALORS
sTemp = texte
//"---fichier ANSI---"
RENVOYER sTemp
FIN
FIN
i++
FIN
FIN
//"---fichier UTF8---"
RENVOYER sTemp

Pour résumé : si un é devient ? après UTF8VersAnsi c'est que le texte était en ANSI.

Pour les 65000 autres caractères... peuvent-ils être présents dans un fichier UTF8 ou ANSI ?
Ne faut-il pas obligatoirement enregistrer en UNICODE ?