PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → UTFConvertit ascii vers UTF16  : retourne une chaine vide
UTFConvertit ascii vers UTF16 : retourne une chaine vide
Iniciado por Telix13, 17,abr. 2024 00:15 - 8 respuestas
Miembro registrado
74 mensajes
Publicado el 17,abril 2024 - 00:15
MaChaîneAnsi est une chaîne ANSI = "Bonjour"
machaineUTF16 est un Buffer = UTFConvertit(MaChaîneAnsi,alphabetCourant,alphabetUTF16BE)
SI ErreurDétectée=Vrai ALORS // aucune erreur detectée
Info(ErreurInfo())
FIN
Info(machaineUTF16) //"ça affiche une chaine vide au lieu de : "0042006f006e006a006f00750072"


Merci
Mensaje modificado, 17,abril 2024 - 00:27
Miembro registrado
511 mensajes
Popularité : +18 (18 votes)
Publicado el 17,abril 2024 - 10:24
Bonjour,

Les fonctions de WINDEV ne gèrent pas nativement les chaînes UTF16BE.
Souvent, elles considèrent le code de caractère <00> comme une marque de fin de chaîne (cf. ASCIIZ).

Si vous affichez le buffer en hexadécimal, vous aurez bien le résultat attendu.
Info(BufferVersHexa(machaineUTF16))

:-)

--
Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…
Mensaje modificado, 17,abril 2024 - 10:24
Miembro registrado
74 mensajes
Publicado el 17,abril 2024 - 14:35
Bonjour =JBO=
je vous remercie pour la réponse
Info(BufferVersHexa(MaChaîneUnicode,SansRegroupement,BigEndian+SansLigne))


désolé mais ça ne convertit pas en UTF16 il manque toujours quelques caractères à la fin de la chaine résultat
Mensaje modificado, 17,abril 2024 - 14:56
Miembro registrado
511 mensajes
Popularité : +18 (18 votes)
Publicado el 17,abril 2024 - 16:38
Re-bonjour Telix13,

Si on repart de votre code pour écrire un fichier texte, le résultat est correct.

Au passage, j'ai précédé le texte converti par le BOM (byte order mark) d'un fichier UTF16 BE.
https://fr.wikipedia.org/wiki/Indicateur_d%27ordre_des_octets

bufBOM_UTF16BE est un Buffer = [0xFE, 0xFF]

MaChaîneAnsi est une chaîne ANSI = "Bonjour"
machaineUTF16 est un Buffer = UTFConvertit(MaChaîneAnsi,alphabetCourant,alphabetUTF16BE)

soit sCheminFichier = "C:\temp\texte UTF16BE.txt"

fSauveBuffer(sCheminFichier, bufBOM_UTF16BE + machaineUTF16)
LanceAppliAssociée(sCheminFichier,"open")

:-)

--
Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…
Miembro registrado
74 mensajes
Publicado el 17,abril 2024 - 17:34
Encore Merci =JBO=
le résultat à l'arrivée est le même c'est vrai,
mais il s'agit d'une valeur d'un paramètre d'une API pour envoi de SMS, la valeur du paramètre (ANSI ou UNICODE) quand j'active type Unicode, et que j'envoie le formulaire avec buffervershex, ou autre contournement ,je recrois un sms en chinois.
mais quand je convertis ici ,

https://onlinetools.com/utf8/convert-utf8-to-utf16,

le résultat est nickel .

j'ai essayé ça
bufBOM_UTF16BE est un Buffer = [0xFE, 0xFF]
MaChaîneAnsi est une chaîne ANSI = "Bonjour"
machaineUTF16 est un Buffer = UTFConvertit(MaChaîneAnsi,alphabetCourant,alphabetUTF16BE)


Code erreur :1705:parametre erroné ou vide.
Miembro registrado
511 mensajes
Popularité : +18 (18 votes)
Publicado el 17,abril 2024 - 19:09
Dans ce qui suit, je parle de types de variable du WLangage.

Si vous voulez gérer du texte encodé en UTF-16 BE, il faut que les données correspondantes soient mémorisées dans une variable de type buffer ou de type chaîne ANSI.

Mais vous ne devez pas utiliser une variable de type chaîne Unicode, qui de toute façon est prévue pour stocker du texte encodé en UTF-16 LE et va provoquer un comportement imprévisible si vous lui affectez directement une valeur de chaîne ou de buffer avec un autre encodage (hormis une "vraie" chaîne ANSI, et encore il faut être prudent avec les pages de codes ANSI et leurs différents alphabets nationaux).

Si vous voulez que l'on vous aide mieux, donnez nous le code problématique.
:-)

--
Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…
Mensaje modificado, 17,abril 2024 - 19:49
Miembro registrado
74 mensajes
Publicado el 18,abril 2024 - 10:03
Bonjour =JBO=

ok je vous envoi le dernier code et merci d'avance pour votre aide!
SI SAI_destinataire_sms~="" ALORS
Erreur("Renseigner le ou les destinataires")
RETOUR
FIN

SI SAI_corp_message~="" ALORS
Erreur("Rédiger le message à envoyer")
RETOUR
FIN


bufBOM_UTF16BE est un Buffer = [0xFE, 0xFF]
MaChaîneAnsi est une chaîne UNICODE = "Bonjour"
machaineUTF16 est un Buffer = UTFConvertit(MaChaîneAnsi,alphabetCourant,alphabetUTF16BE)

oprerat_1 est une httpRequête // non du formulaire
oprerat_1.URL = "https://xxxx.xxxxxx.com:8443/bulksms/bulksms?"
oprerat_1.Méthode = httpPost

HTTPCréeFormulaire("oprerat_1" )
HTTPAjouteParamètre( "oprerat_1", "username", "USER_NAME")
HTTPAjouteParamètre( "oprerat_1", "password", "SMS4014")
HTTPAjouteParamètre( "oprerat_1", "message",machaineUTF16)
HTTPAjouteParamètre( "oprerat_1", "source","ID_SENDER")
HTTPAjouteParamètre( "oprerat_1", "destination",SAI_destinataire_sms)
HTTPAjouteParamètre( "oprerat_1", "type","2") // 2=unicode
HTTPAjouteParamètre( "oprerat_1", "dlr","0")


opreat_1_Réponse est une httpRéponse = HTTPEnvoieFormulaire("oprerat_1",oprerat_1)
smsRéponse est une chaîne ANSI = opreat_1_Réponse.Contenu

//trace(schaineUtf)
SI ExtraitChaîne(smsRéponse,1,"|") = "1701" ALORS
Info("Message Sms Envoyé !")
SINON
Erreur(smsRéponse,"erreur d'envoi !")
FIN


code erreur:1705 paramètre vide.(message)
Mensaje modificado, 18,abril 2024 - 10:05
Miembro registrado
511 mensajes
Popularité : +18 (18 votes)
Publicado el 18,abril 2024 - 11:19
Bonjour Telix13,

Dans le WLangage de WINDEV ,le type de variable Chaîne Unicode correspond à du texte au format UTF-16 LE.

Avec la fonction UTFConvertit() il est facile de passer de Chaîne Unicode (UTF-16 LE) au format UTF-16 BE.

On le constate avec le code ci-dessous qui donne comme résultat:
UNICODE WINDEV == UTF16LE:  42 00 6F 00 6E 00 6A 00 6F 00 75 00 72 00
UNICODE WINDEV >> UTF16BE:  00 42 00 6F 00 6E 00 6A 00 6F 00 75 00 72


// le format utilisé dans une chaîne UNICODE de WINDEV est UTF-16 LE
MaChaîneUnicode est une chaîne UNICODE = "Bonjour"

Trace("UNICODE WINDEV == UTF-16 LE: "+BufferVersHexa(MaChaîneUnicode))


MaChaîneUTF16BE est un Buffer = UTFConvertit(MaChaîneUnicode,alphabetUnicode,alphabetUTF16BE)

Trace("UNICODE WINDEV >> UTF-16 BE: "+BufferVersHexa(MaChaîneUTF16BE))


Pour revenir à votre besoin, apparemment il s'agit de l'API Route Mobile SMSPLUS - Bulk HTTP API.
Dans le cas d'un message au format UTF-16 BE, il doit être encodé en hexadécimal.
SI SAI_destinataire_sms~="" ALORS
Erreur("Renseigner le ou les destinataires")
RETOUR
FIN

SI SAI_corp_message~="" ALORS
Erreur("Rédiger le message à envoyer")
RETOUR
FIN

MaChaîneUnicode est une chaîne UNICODE = "Bonjour"
MaChaîneUTF16BE est un Buffer = UTFConvertit(MaChaîneUnicode,alphabetUnicode,alphabetUTF16BE)

oprerat_1 est une httpRequête // non du formulaire
oprerat_1.URL = "https://xxxx.xxxxxx.com:8443/bulksms/bulksms?"
oprerat_1.Méthode = httpPost

HTTPCréeFormulaire("oprerat_1" )
HTTPAjouteParamètre( "oprerat_1", "username", "USER_NAME")
HTTPAjouteParamètre( "oprerat_1", "password", "SMS4014")
HTTPAjouteParamètre( "oprerat_1", "message",BufferVersHexa(MaChaîneUTF16BE,SansRegroupement,SansLigne))
HTTPAjouteParamètre( "oprerat_1", "source","ID_SENDER")
HTTPAjouteParamètre( "oprerat_1", "destination",SAI_destinataire_sms)
HTTPAjouteParamètre( "oprerat_1", "type","2") // 2=unicode
HTTPAjouteParamètre( "oprerat_1", "dlr","0")

:-)

--
Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…
Miembro registrado
74 mensajes
Publicado el 18,abril 2024 - 16:38
Excellent :merci:

c'est résolu

je vous Remercie =JBO=