|
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 SAI_Direct_unicode = fChargeTexte(snomfic) s = SAI_Direct_unicode FIN SAI_Ansi = s
avez vous une meilleur solution ? |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 890 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 574 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 890 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) 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 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 346 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 346 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 ? |
| |
| |
| | | |
|
| | | | |
| | |
|