Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je dois modifier une application en PowerBuilder 10.5 : Sauvegarde d'un fichier au format CSV avec encodage UTF8 sans BOM.
Pour le moment de parviens à faire la sauvegarde en UTF8 mais avec BOM.
Existe-t-il une méthode afin de procéder à la sauvegarde de mon fichier avec encodage UTF8 sans BOM?
Merci
Hors ligne
le bom à l'air d'être des caractères supplémentaires rajoutés au début du fichier : https://en.wikipedia.org/wiki/Byte_order_mark
donc il suffirait de les effacer.
Hors ligne
FlorentP a écrit:
le bom à l'air d'être des caractères supplémentaires rajoutés au début du fichier : https://en.wikipedia.org/wiki/Byte_order_mark
donc il suffirait de les effacer.
En effet, les trois premiers octets définissent le BOM.
Ma question : Comment les retirer sans compromettre l'intégrité du fichier et être certain que le fichier est en UTF8 sans BOM?
Hors ligne
tu ouvres ton fichier en mode StreamMode! et tu recopies tout dans un second fichier à partir du 4 iéme octet par exemple.
Dernière modification par FlorentP (17-05-2016 20:14:19)
Hors ligne
FlorentP a écrit:
tu ouvres ton fichier en mode StreamMode! et tu recopies tout dans un second fichier à partir du 4 iéme octet par exemple.
C'est exactement ce que j'ai fait :
1 - Ouverture du premier fichier ainsi
FileOpen(ls_nom_fic, LineMode!, Write!, LockWrite!, Replace!, EncodingUTF8!)
2 - Ecriture dans le fichier
3 - Fermeture du fichier
4 - Ouverture du fichier en StreamMode! avec mise en mémoire dans une variable blob - Fermeture du fichier
5 - Récupération des trois premiers octets dans tois variables différentes de type byte
6 - Test si les trois variables sont respectivement égales à 239, 187 et 181
7 - Dans ce cas le fichier est de type UTF8 avec BOM, on récupère le contenu de la variable blob à partir du 4ème caractère
8 - On ouvre le fichier en StreamMode! en réécrivant le contenu de la varaible blob par blocs de 32765 octets
Et cela fonctionne, quelle galère.
Hors ligne
cantin_jl a écrit:
FlorentP a écrit:
tu ouvres ton fichier en mode StreamMode! et tu recopies tout dans un second fichier à partir du 4 iéme octet par exemple.
[RESOLU] C'est exactement ce que j'ai fait :
1 - Ouverture du premier fichier ainsiCode:
FileOpen(ls_nom_fic, LineMode!, Write!, LockWrite!, Replace!, EncodingUTF8!)2 - Ecriture dans le fichier
3 - Fermeture du fichier
4 - Ouverture du fichier en StreamMode! avec mise en mémoire dans une variable blob - Fermeture du fichier
5 - Récupération des trois premiers octets dans tois variables différentes de type byte
6 - Test si les trois variables sont respectivement égales à 239, 187 et 181
7 - Dans ce cas le fichier est de type UTF8 avec BOM, on récupère le contenu de la variable blob à partir du 4ème caractère
8 - On ouvre le fichier en StreamMode! en réécrivant le contenu de la varaible blob par blocs de 32765 octets
Et cela fonctionne, quelle galère.
Hors ligne
cantin_jl a écrit:
Et cela fonctionne, quelle galère.
C'est la toute la beauté de la chose.
Hors ligne
FlorentP a écrit:
tu ouvres ton fichier en mode StreamMode! et tu recopies tout dans un second fichier à partir du 4 iéme octet par exemple.
Tant qu'à faire, si le contenu du fichier est disponible dans une string, autant ouvrir le fichier résultat en StreamMode!, et écrire dedans un blob qui sera au bon format, un prototype FileWrite() supporte l'écriture de blob, et on peut convertir une string en blob en précisant l'encodage, le bom n'est pas inclus.
En gros:
int li_file blob lbl_data li_file = FileOpen(ls_nom_fic, streamMode!, Write!, LockWrite!, Replace!) lbl_data = blob(ls_content, EncodingUtf8!) FileWrite(li_file, lbl_data) FileClose(li_file)
Code non testé, je n'ai pas de PB sous la main au moment où j'écris ça...
Bon, si l'écriture dans le fichier se fait en plusieurs fois, c'est un autre problème.
Pour ce qui est des BOMs (utf16 et utf8) c'est simple : PB ne sait pas gérer autrement les fichiers non "ansi" (= différents du code natif local de l'OS) si il ne sont pas présents, PB suppose toujours que le fichier est en encodingAnsi! en lecture, et il ajout automatiquement le BOM en écriture pour les utf...
Hors ligne