PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Charger un fichier texte Ansi ou UTF8
Charger un fichier texte Ansi ou UTF8
Iniciado por Xavlod, nov., 06 2020 10:05 AM - 11 respostas
Membro registado
31 mensagems
Popularité : +1 (1 vote)
Publicado em novembro, 06 2020 - 10:05 AM
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 ?
Membro registado
3.885 mensagems
Popularité : +227 (347 votes)
Publicado em novembro, 06 2020 - 11:08 AM
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
Membro registado
31 mensagems
Popularité : +1 (1 vote)
Publicado em novembro, 06 2020 - 11:12 AM
Merci de la précision, je pensais avoir la berlue.
Du coup, comment procéderais tu dans ce cas ?
Membro registado
1.603 mensagems
Popularité : +64 (70 votes)
Publicado em novembro, 09 2020 - 9:57 AM
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
Membro registado
2.572 mensagems
Popularité : +222 (260 votes)
Publicado em novembro, 09 2020 - 10:06 AM
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
Membro registado
3.885 mensagems
Popularité : +227 (347 votes)
Publicado em novembro, 09 2020 - 10:47 AM
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
Membro registado
31 mensagems
Popularité : +1 (1 vote)
Publicado em novembro, 09 2020 - 3:54 PM
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 ***
Publicado em junho, 10 2022 - 11:27 AM
Beau travail !

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

Eric
Membro registado
3.342 mensagems
Popularité : +93 (137 votes)
Publicado em junho, 10 2022 - 5:39 PM
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.
Membro registado
102 mensagems
Popularité : +4 (4 votes)
Publicado em setembro, 27 2022 - 2:46 PM
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
Membro registado
3.342 mensagems
Popularité : +93 (137 votes)
Publicado em setembro, 27 2022 - 3:15 PM
Désolé dav,
Je me vois mal rajouter 65000 caractéres
Cdt
Membro registado
102 mensagems
Popularité : +4 (4 votes)
Publicado em outubro, 13 2022 - 12:39 PM
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 ?