Répétez apres moi :J'aime PBAdonf. J'aime PBAdonf. J'aime PBAdonf.

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 24-03-2015 16:06:17

Marcus  
Membre Geek
Lieu: Namur
Date d'inscription: 20-06-2006
Messages: 39
Pépites: 258
Banque: 0

Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Bonjour à tous,

J'ai besoin de vos lumières
Nous sommes malheureusement en PB9. Aucune possibilité de migration.

Je dois importer des fichiers XML multilingues et enregistrer leur contenu dans une table ORACLE
Tout se passe bien pour les langues communes.
Le problème vient des contenus cyrilliques et certains caractères espagnols.

J'utilise un PBDOM_DOCUMENT pour importer le fichier. Ensuite, j'utilise de manière classique une fonction récursive pour récupérer tous les éléments
Les textes des langues grecques, espagnoles, bulgares, ... sont ignorés.

J'ai ensuite utilisé une autre possibilité.
Fileopen puis fileread pour stocker l'entièreté du XML dans un blob, puis le convertir en string.
Là aussi, c'est OK pour les langues "normales", mais j'obtiens des ? pour les caractères grecs notamment.

J'ai parcouru le forum, je pense bien qu'il s'agit d'un problème de code (utf-8, ansi, ...)
Mais je bloque.

Merci de votre aide  !!!

Hors ligne

 

#2 25-03-2015 03:49:42

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1120
Pépites: 4,296,080,217
Banque: 9,223,372,036,854,775,808
Site web

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Les encodages, c'est toujours un sujet épique , mais pas si compliqué. Il suffit d'être rigoureux et d'avancer pas à pas pour ne pas s'arracher trop de cheveux

Effectivement ça semble un problème d'encodage. Quelques pistes à vérifier :
- quelle est l'encodage retenu pour la base ? En fonction de la réponse, le stockage correct de caractères "exotiques" peut ne pas être possible (par exemple quand on utilise Latin-1 / ISO-8859-1, on ne peut pas stocker le caractère € (euro)). Si la base utilise utf-8 ou utf-16 ça devrait au moins être faisable
- quel est l'encodage des données au départ ? Est-ce qu'on maîtrise l'application qui les génére ?
- quel est l'encodage du fichier xml (indiqué sur la première ligne du fichier)
- normalement PB9 est "ansi". Il ne supporte pas nativement unicode et utilise l'encodage défini par le système -CP1252 dans nos régions-, mais comme Windows supporte unicode depuis fort longtemps, on peut toujours faire appel à l'API si on veut traduire des encodages, c'est "juste" un peu fastidieux (appels à MultiByteToWideChar et WideCharToMultiByte par exemple)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#3 25-03-2015 13:57:22

Marcus  
Membre Geek
Lieu: Namur
Date d'inscription: 20-06-2006
Messages: 39
Pépites: 258
Banque: 0

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Merci pour la réponse !!
Effectivement, sujet épique pour moi. je n'ai jamais été confronté à ce genre de choses. Je bloque toujours.

L'encodage retenu pour la base est UTF-8. Pas de problème de ce côté. On a des application web qui enregistrent déjà des textes au format "exotiques" dans la base.

Les données XML sont aussi au format UTF-8

J'ai donc fait appel aux API, tels qu'expliqué sur le post http://pbadonf.fr/forum/viewtopic.php?id=4141&p=1


Voici le XML

Code: xml

Hors ligne

 

#4 25-03-2015 17:44:06

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1120
Pépites: 4,296,080,217
Banque: 9,223,372,036,854,775,808
Site web

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Hum, sur StackO, j'aurais commenté en disant "Et quelle est la question ?"

Bon, si la base utilise déjà utf-8, le plus gros est fait

Avec les encodages, il faut être un peu parano et vérifier si l'affichage que nous fait l'ordi des données est exact : çàd, pour être sûr de l'encodage effectif du fichier, il faudrait regarder avec un éditeur hexa (j'ai déjà vu des fichiers xml mentir )

Quand je sauve la première ligne en utf-8 (avec BOM, mais ce n'est pas important), voici ce que j'ai :

Code: Hexa montré par HxD

00000000  EF BB BF 46 4F 52 53 4C 41 47 20 54 49 4C 20 52 C3 85 44 45 54 53 20 46 4F 52 4F 52 44 4E 49 4E  FORSLAG TIL RÅDETS FORORDNIN
00000020  47 20 28 45 C3 98 46 29 20 6F 6D 20 C3 A6 6E 64 72 69 6E 67 20 61 66 20 66 6F 72 6F 72 64 6E 69  G (EØF) om ændring af forordni
00000040  6E 67 20 28 45 C3 98 46 29 0D 0A                                                                 ng (EØF)..

Ce qui est important c'est que les caractères "Å" sont bien en réalité "Ã…" ou les "EØF" -> "EØF".

Donc au début (fichier) et à la fin (database), ça serait ok...

Je ne sais pas si le fil cité en exemple peut t'aider tel-quel (le message important c'est http://pbadonf.fr/forum/viewtopic.php?pid=34769#p34769 parce que le reste c'était un peu du bricolage ), mais dans ce fil il fallait traduire des caractères utf-8 "bruts" (avec plusieurs octets pour véhiculer 1 caractère) en caractères "ansi" uniques (par exemple "€" est corrigé en "€", le "CP_ACP" indique que widechartomultibyte traduira si possible vers le bon caractère dans l'encodage spécifié dans les paramètres régionaux locaux au poste windows si le caractère est disponible, sinon avec un '?').

Mais toi tu as des caractères ut-8 "bruts" que PB9 ne sait pas interpréter, et tu veux les envoyer dans une base qui connait utf-8. Il suffit peut-être d'indiquer à la base que tu lui envoies de l'utf-8 ?

Comment le contenu du fichier est-il envoyé dans la base ? Mes souvenirs rouillés de PB+Oracle remontent à PB5 et Oracle 7.3 et à cette époque le problème de l'euro ne se posait pas encore


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#5 25-03-2015 20:57:40

Marcus  
Membre Geek
Lieu: Namur
Date d'inscription: 20-06-2006
Messages: 39
Pépites: 258
Banque: 0

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

C'est vrai que la question est complexe.
Mais en phasant le problème, je dirais que la première question qui se pose est la suivante :

Comment récupérer un texte (qu'il vienne d'un XML ou non) qui contient des caractères cyrilliques ou autres ... (a priori codés utf-8) et le stocker dans une variable ou une datawindow sans transformation des caractères ??
... et tout çà en PB 9 bien sur !!

Hors ligne

 

#6 26-03-2015 11:56:29

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1120
Pépites: 4,296,080,217
Banque: 9,223,372,036,854,775,808
Site web

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Marcus a écrit:

C'est vrai que la question est complexe.

Le truc, c'est qu'il y a une succession d'étapes et que si on ne maîtrise pas, on peut introduire des ennuis à chaque étape.
C'est pour cela que j'insiste sur la décomposition et la vérification à chacune d'elles. Si on grille des étapes, parfois on se tire une balle dans le pied tout seul.

Marcus a écrit:

Mais en phasant le problème, je dirais que la première question qui se pose est la suivante :

Comment récupérer un texte (qu'il vienne d'un XML ou non) qui contient des caractères cyrilliques ou autres ... (a priori codés utf-8) et le stocker dans une variable ou une datawindow sans transformation des caractères ??
... et tout çà en PB 9 bien sur !!

Si tu ne veux pas transformer, il suffit de lire le fichier, comme PB9 ne connaît pas utf (8 ou 16) comme les autres PB à partir du 10, dans la variable string (ou blob suivant ton code) en interne les caractères exotique seront présents dans leur forme "brute" (par exemple si le caractère est "é" au départ, en utf-8 ça donne "é" mais ça reste du texte).
PB9 ne saura pas les afficher correctement (dans une DW ou même en regardant le contenu de la variable en debug) mais ça devrait pouvoir être transmis à la base correctement, sauf si il y a un transformation entre PB et Oracle. Comment tu passes les données à la base ?


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#7 27-03-2015 10:29:41

Marcus  
Membre Geek
Lieu: Namur
Date d'inscription: 20-06-2006
Messages: 39
Pépites: 258
Banque: 0

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Pas de solution semble-t-il pour importer du texte "exotique" dans une variable ou une datawindow en PB 9

J'ai donc importé une majorité du fichier, que je peux alors gérer et enregistrer en DB

Pour le reste, j'utilise un simple fileread pour stocker l'entièreté du fichier en format blob.
Ensuite avec l'utilisation de la fonction BlobMid, je peux isoler la partie contenant des caractères cyrillique.
Il suffit alors d'enregistrer cela dans un blob Oracle

Assez contraignant mais bon

Hors ligne

 

#8 27-03-2015 16:44:33

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1120
Pépites: 4,296,080,217
Banque: 9,223,372,036,854,775,808
Site web

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Marcus a écrit:

Pas de solution semble-t-il pour importer du texte "exotique" dans une variable ou une datawindow en PB 9 [...]

Il ne faut pas confondre les données et la représentation des données. Du texte utf-8 peut très bien être lu par pb sans que celui-ci soit capable de les afficher correctement, mais transmis sans l'altérer à la base qui sera capable de le restituer correctement.

Blobmid() pourquoi pas (même si j'ai un doute, ça ressemble au bricolage cité plus haut pour "corriger" l'euro), mais tu risques de ne traiter que quelques cas particuliers au cyrillique, et le jour où ce sera une autre langue... Par ailleurs, parser de l'xml à coup de blobmid quand il y a pbdom c'est aussi du bricolage.

Je veux bien essayer de t'aider, mais j'ai plusieurs fois demandé comment les données étaient envoyées dans la base et tu ne réponds pas à la question.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#9 31-03-2015 16:19:29

Marcus  
Membre Geek
Lieu: Namur
Date d'inscription: 20-06-2006
Messages: 39
Pépites: 258
Banque: 0

Re: Importer fichier XML avec caractères cyrilliques et stocker en ORACLE

Merci Seki.

... J'avance
Effectivement, il ne faut pas confondre les données et leur représentation.
Et comment tu l'as bien dit, si le caractère est "é" au départ, en utf-8 ça donne "é" mais ça reste du texte.

Le problème avec PB 9, c'est que le cyrillique ou autre alphabet exotique est transformé quand lu en string et est donc irrécupérable (ex: '????TO ...')
La seule solution est donc de l'importer dans une variable de type blob

Bien sur, le pbdom ne fonctionne pas non plus avec les caractères cyrillques ou bizarres avec PB 9 et la pbdom90. Ce qui est dans la même logique
Donc, à partir de la variable blob, on doit donc faire du parsing. Soit on le fait dans PB 9 avec le blobmid, soit dans Oracle via une stored proc.

J'ai pris le parti de faire çà en PB. Je sais que les textes au format cyriliiques, arabes, russes, thai ou autres sont tous compris dans un tag "<title" avec code langue.
Ex : <title lang="ELL" from="final">ΠΡΟΤΑΣΗ ΚΑΝΟΝΙΣΜΟΥ (ΕΟΚ) TOΥ ΣΥΜΒΟΥΛΙΟΥ για την τροποποίηση του κανονισμού (ΕΟΚ) αριθ. </title>

Je peux donc faire du parsing avec blobmid et récupérer le texte dans une variable blob.
Il suffit ensuite d'enregistrer cette variable au niveau Oracle dans un BLOB ou CLOB

ET pour répondre à ta question. Comment les données sont envoyées à la base. Cà c'est très simple :
Je crée un record avec l'Id et le code langue, ... puis l'update pour le Blob
Ex : UPDATEBLOB COM_TITRE SET CTI_IMAGE = :lbl_Texte WHERE CTI_ID = :ll_Id ;

A noter que tout cela est complétement inutile avec PB10 puisque là le PBDom fonctionne correctement et le traitement des variables et la représentation du grec sont parfaits


Ultime question donc :
- Un moyen d'éviter ce parsing blob ou d'améliorer l'import (bricolage) ?

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22