Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Urgent SVP... Problème d'accents avec les Web Services

23 réponses
Avatar
JC
Bonjour,

J=92esp=E8re que quelqu=92un m=92apportera la solution car j'ai d=E9j=E0 pe=
rdu 6
jours de travail =E0 chercher partout des solutions, et tous mes projets
sont bloqu=E9s =E0 cause de ce probl=E8me ...

Je dois utiliser les services Web, mais j'ai un s=E9rieux probl=E8me avec
les cha=EEnes non ASCII (par exemple celles avec des accents, tel que
"J=E9r=F4me").

Voici deux morceaux de mon code : un extrait du WSDL, et des boutons
pour utiliser deux fonctions tr=E8s simples du service Web.

- La premi=E8re fonction (qui me sert de test pour l'envoi avec accent)
est Hello_Name (aName, aLogin, aPwd), qui utilise 3 cha=EEnes de
caract=E8res comme param=E8tres et renvoie simplement le param=E8tre
"aName" dans le message "Bonjour mon cher aName". Si j=92envoie "John",
je re=E7ois "Bonjour mon cher John", mais si j=92envoie "J=E9r=F4me", je
re=E7ois "Bonjour mon cher J?R?me" et pas "Bonjour mon cher J=E9r=F4me".
Quand je teste ce service web en Flash ou C#, je n'ai aucun probl=E8me
avec les accents, je re=E7ois "Bonjour mon cher J=E9r=F4me".

- La deuxi=E8me fonction (qui me sert pour la r=E9ception d'accent) est
voir_users_meeting (aLogin), qui utilise 1 cha=EEne en param=E8tre ("1234"
en fait) et retourne tout simplement toujours la m=EAme liste de noms,
dont un nom avec accent ( "Zo=E9"). Encore une fois, avec Flash ou C#,
pas de probl=E8me, mais avec Windev je re=E7ois "Zo=C3=A9" et non pas "Zo=
=E9".

J'ai essay=E9 beaucoup de solutions, mais je suppose 'pas la bonne'. Par
exemple, j'ai essay=E9:
- des appels avec SOAP.name [], SOAP.type []=85
- l'importation du webservice comme une collection de proc=E9dures
(comme pr=E9vu par Windev), puis d'appeler ces proc=E9dures. C'est la
solution que j'utilise en ce moment.
- de transformer les chaines avant l'envoi (et/ou apr=E8s) en (ou =E0
partir de) XML, Unicode, ANSI, OEM, URL, etc.
- d'utiliser des chaines fixes, des cha=EEnes de caract=E8res ASCIIZ, des
chaines UNICODE, etc., en tant que param=E8tres.

Rien ne me donne "J=E9r=F4me" ou "Zo=E9" :-(

J'ai vraiment besoin de votre aide. J'esp=E8re que quelqu'un a la
solution.

Cordialement
JC Tarby


//----------partie concern=E9e du WSDL------------
<?xml version=3D"1.0" encoding=3D"utf-8" ?>
<wsdl:definitions xmlns:soap=3D"http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm=3D"http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc=3D"http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime=3D"http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns=3D"USTL_LIFL_TRIGONE" xmlns:s=3D"http://www.w3.org/2001/
XMLSchema" xmlns:soap12=3D"http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http=3D"http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace=3D"USTL_LIFL_TRIGONE" xmlns:wsdl=3D"http://
schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault=3D"qualified"
targetNamespace=3D"USTL_LIFL_TRIGONE">
<s:element name=3D"Hello_Name">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"name" type=3D"s:string" =
/>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"login" type=3D"s:string"=
/
>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"pwd" type=3D"s:string" /=
>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=3D"Hello_NameResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"Hello_NameResult"
type=3D"s:string" />
</s:sequence>
</s:complexType>
</s:element>
//..................
<s:element name=3D"voir_users_meeting">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"id_meeting"
type=3D"s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name=3D"voir_users_meetingResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"voir_users_meetingResult=
"
type=3D"s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>


//------------- code Windev pour Hello_Name (code dans un bouton)

stResultat est STHello_NameResponse
stTexteAEnvoyer est cha=EEne
// j=92ai essay=E9 aussi: stTexteAEnvoyer est STHello_Name
//et aussi: stTexteAEnvoyer est cha=EEne UNICODE, etc....
//
//
// j=92ai essay=E9: stTexteAEnvoyer:m_name=3D"J=E9r=F4me"
// et aussi: stTexteAEnvoyer=3DAnsiVersUnicode("J=E9r=F4me")
stTexteAEnvoyer=3D"J=E9r=F4me"
stResultat=3DHello_Name(stTexteAEnvoyer, "my_login", "my_password")
// j=92ai essay=E9: stR=E9sultat=3DHello_Name(stTexteAEnvoyer:m_name,
"mon_login", "mon_password")
Info(stResultat:m_Hello_NameResult)
// et aussi
stResultat:m_Hello_NameResult=3DXMLVersTexte(stResultat:m_Hello_NameResult)
Info(stResultat:m_Hello_NameResult)


//------------- code Windev pour voir_users_meeting (code dans un
bouton)
//c=92est juste un exemple de tous mes essais=85..
stResultat est STvoir_users_meetingResponse
sTexteAEnvoyer est cha=EEne
sTexteAEnvoyer=3D"1234"
stResultat=3Dvoir_users_meeting(sTexteAEnvoyer)
stResultat:m_voir_users_meetingResult=3DXMLVersTexte(stResultat:m_voir_user=
s_meetingResult)
Info(stResultat:m_voir_users_meetingResult)


//------fin du code

10 réponses

1 2 3
Avatar
Romain PETIT
JC avait soumis l'idée :

Vous voyez, c'est pas simple ... Une autre idée ?



Quelle est le type de la variable stRésultat:m_Hello_NameResult ?
Ce doit être une chaine unicode...

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
JC
> Quelle est le type de la variable stRésultat:m_Hello_NameResult ?
Ce doit être une chaine unicode...



je ne sais pas, j'ai donné plus haut tout le code que j'ai, a priori
ce n'est pas Unicode. Comment savoir le type de cette variable ? Si
vous regardez le code plus haut, dans les procédures privées, les
lignes où elle apparait sont du genre de :
param:m_Hello_NameResult=XMLDonnée(doc)

du coup j'ai essayé ceci :
stRésultat est STHello_NameResponse
sTexteEnvoyé est une chaîne
sTexteReçu est une chaîne

sTexteEnvoyé=ChaîneVersUTF8("Jérôme")

stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")

sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
Info(sTexteReçu)

sTexteReçu=UTF8VersChaîne(sTexteReçu)
Info(sTexteReçu)


et j'obtiens dans les deux Info: J??r??me

Que faire ? Pour info, si je déclare une variable chaine Unicode pour
stocker le résultat du WS, je me fais jeter : impossible de stocker
une structure...

JCT
Avatar
Romain PETIT
JC avait soumis l'idée :

Que faire ? Pour info, si je déclare une variable chaine Unicode pour
stocker le résultat du WS, je me fais jeter : impossible de stocker
une structure...



Ta structure STHello_NameResponse, comment est-elle définie ?

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
patrice
j'ai du mal à comprendre ton test :

stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")
sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
Info(sTexteReçu)



que recoit exactement le WS hello_name ?
qu'envoi t'il exactement ?


"JC" a écrit dans le message de
news:
Quelle est le type de la variable stRésultat:m_Hello_NameResult ?
Ce doit être une chaine unicode...



je ne sais pas, j'ai donné plus haut tout le code que j'ai, a priori
ce n'est pas Unicode. Comment savoir le type de cette variable ? Si
vous regardez le code plus haut, dans les procédures privées, les
lignes où elle apparait sont du genre de :
param:m_Hello_NameResult=XMLDonnée(doc)

du coup j'ai essayé ceci :
stRésultat est STHello_NameResponse
sTexteEnvoyé est une chaîne
sTexteReçu est une chaîne

sTexteEnvoyé=ChaîneVersUTF8("Jérôme")

stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")

sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
Info(sTexteReçu)

sTexteReçu=UTF8VersChaîne(sTexteReçu)
Info(sTexteReçu)


et j'obtiens dans les deux Info: J??r??me

Que faire ? Pour info, si je déclare une variable chaine Unicode pour
stocker le résultat du WS, je me fais jeter : impossible de stocker
une structure...

JCT
Avatar
patrice
Sinon au pire
met un spy web pour vérifier le contenu des trame soap qui partent et
arrivent

perso j'utilise fiddler, marche tres bien pour le web, ca devrait assurer
pour le soap

"JC" a écrit dans le message de
news:
Quelle est le type de la variable stRésultat:m_Hello_NameResult ?
Ce doit être une chaine unicode...



je ne sais pas, j'ai donné plus haut tout le code que j'ai, a priori
ce n'est pas Unicode. Comment savoir le type de cette variable ? Si
vous regardez le code plus haut, dans les procédures privées, les
lignes où elle apparait sont du genre de :
param:m_Hello_NameResult=XMLDonnée(doc)

du coup j'ai essayé ceci :
stRésultat est STHello_NameResponse
sTexteEnvoyé est une chaîne
sTexteReçu est une chaîne

sTexteEnvoyé=ChaîneVersUTF8("Jérôme")

stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")

sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
Info(sTexteReçu)

sTexteReçu=UTF8VersChaîne(sTexteReçu)
Info(sTexteReçu)


et j'obtiens dans les deux Info: J??r??me

Que faire ? Pour info, si je déclare une variable chaine Unicode pour
stocker le résultat du WS, je me fais jeter : impossible de stocker
une structure...

JCT
Avatar
JC
Pour complément, j’ai essayé le mode débogage Windev en pas à pa s.
Voici ce que j’ai obtenu :

Lorsqu’on entre dans la procédure :
PROCEDURE PRIVÉE _STHello_NameResponse_DepuisXML(param est un
STHello_NameResponse, doc est une chaîne),

On constate que la ligne :
param:m_Hello_NameResult=XMLDonnée(doc)
correspond au retour du WS

Avant cette ligne param:m_Hello_NameResult vaut “”
et après cette ligne il vaut J??r??me

La trace faite côté serveur dit la même chose (la chaîne reçue es t J??
r??me).
Donc c’est bien l’envoi par Windev (ou la façon dont Windev appelle l e
WS) qui déconne. Mais pourquoi ? et quelle solution ?

Là, je sèche vraiment… Avec Flash, j’envoie une bête String, et j e
reçois une bête String qui contient "Jérôme". On ne peut pas faire
plus simple... alors pourquoi Windev le sait pas le faire aussi
facilement ?

JCT
Avatar
Olivier P.
Salut,

je me mèle à la discussion par curiosité ;-)

En regardant bien le code de la fonction HelloName, je pense qu'il faut que
tu modifies :
SOAP.Valeur[1]=name
par
SOAP.ValeurEtendue[1]=name

cf. l'aide en ligne : SOAP.Valeur transfert une chaine ANSI (après
conversion pour de l'Unicode).
En utilisant ValeurEtendue à la place, aucune conversion n'est effectuée.

De plus, je te conseille d'utilisée de typer les variables passées à la
procédure.

STP, dis-nous ce que ça donne !

A+

Oliv


JC avait écris :

Pour complément, j’ai essayé le mode débogage Windev en pas à pas.
Voici ce que j’ai obtenu :

Lorsqu’on entre dans la procédure :
PROCEDURE PRIVÉE _STHello_NameResponse_DepuisXML(param est un
STHello_NameResponse, doc est une chaîne),

On constate que la ligne :
param:m_Hello_NameResult=XMLDonnée(doc)
correspond au retour du WS

Avant cette ligne param:m_Hello_NameResult vaut “”
et après cette ligne il vaut J??r??me

La trace faite côté serveur dit la même chose (la chaîne reçue est J??
r??me).
Donc c’est bien l’envoi par Windev (ou la façon dont Windev appelle le
WS) qui déconne. Mais pourquoi ? et quelle solution ?

Là, je sèche vraiment… Avec Flash, j’envoie une bête String, et je
reçois une bête String qui contient "Jérôme". On ne peut pas faire
plus simple... alors pourquoi Windev le sait pas le faire aussi
facilement ?

JCT
Avatar
JC
Bonsoir Olivier

En regardant bien le code de la fonction HelloName, je pense qu'il faut q ue
tu modifies :
SOAP.Valeur[1]=name
par
SOAP.ValeurEtendue[1]=name



donc dans la fonction HelloName, j'ai remplacé :
SOAP.Nom[1]="name"
SOAP.Type[1]=SOAPTypeChaîne
SOAP.Valeur[1]=name

par:
SOAP.Nom[1]="name"
SOAP.Type[1]=SOAPTypeChaîne
SOAP.ValeurEtendue[1]=name

En testant, j'ai une erreur Windev lors de l'appel à HelloName sur la
ligne modifiée (ValeurEtendue) et qui dit :
Erreur à la ligne 6 du traitement Procédure globale Hello_Name.
Un élément de type chaîne ne peut pas être converti vers le type
variant.

:-( Dois-je changer d'autres choses encore pour que ce test puisse
fonctionner ?
JCT
Avatar
Olivier P.
Bonjour JC,

OK, il serait probablement bon de typer name en chaine Unicode ou en buffer pour faire ce test.

OU !

de laisser tel quel et de faire l'encodage à ce moment là. Ce qui donnerait :

SOAP.ValeurEtendue[1]= ChaineVersUTF8(name)

Bonne journée !

Oliv
Avatar
JC
Bonjour à tous

J'ai essayé aussi, avec plein de combinaisons possibles (chaine
unicode, buffer, conversion vers UTF8, valeur étendue, etc.), mais
toujours sans succès. Peut-être que je suis passé à côté... Si vous
voulez, vous pouvez tester par vous-mêmes le WS avec Windev. Pour
cela, envoyez-moi un mail (vous avez mon adresse dans mon profil), et
je vous donnerai l'URL du WSDL ainsi que login et mot de passe. Comme
ça, vous pourrez importer le WS comme je l'ai fait (en ensemble de
procédures). Je vous donne ci-dessous le code du bouton.

stRésultat est STHello_NameResponse
sTexteEnvoyé est une chaîne
sTexteReçu est une chaîne

sTexteEnvoyé="Jérôme"
stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")

sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
Info(sTexteReçu)

sTexteReçu=UTF8VersChaîne(sTexteReçu)
Info(sTexteReçu)


JCT
1 2 3