Comm WinSock VB6 <-> VB.Net (Encoding, UTF-8, Unicode)

Problématique

Comment faire dialoguer deux applications :
- l'une faite en VB6 et utilisant le composant Winsock
- l'autre faite sous VB.Net

La méthode .SendData du composant Winsock (VB6) propose d'envoyer un tableau de Bytes, mais elle accepte aussi d'utiliser une chaine de caractère, en l'occurrence Unicode puisque VB6 gère des chaines Unicode.

Le problème qui se pose est que les caractères accentués émis par VB6 ne sont pas correctement transmis et reçu par VB.Net.
La raison est simple et tient dans une simple ligne dans l'aide que j'ai mis 4h à trouver :
"Si une chaîne UNICODE est passée en entrée, elle est convertie en une chaîne ANSI avant d'être envoyée sur le réseau"

Or, côté VB.Net, ANSI n'est pas reconnu comme un encodage et, à ma connaissance, il n'y a pas d'outil de conversion dans les frameworks.

Solution

Convertir proprement la chaine de caractères à transmettre dans le SendData en préparant le tableau de Byte nécessaire.

Après quelques recherches, la méthode la plus rapide et la plus simple est cette source trouvée sur le Net : http://www.nonhostile.com/howto-convert-byte-array-utf8-string-vb6.asp et qui s'appuie sur les Stream la bibliothèque ADODB (Microsoft ActiveX Data Objects 2.5 Library)

Extrait du code

Public Function ConvertStringToUtf8Bytes(ByRef strText As String) As Byte()
Dim objStream As ADODB.Stream
Dim data() As Byte
' init stream
Set objStream = New ADODB.Stream
objStream.Charset = "utf-8"
objStream.Mode = adModeReadWrite
objStream.Type = adTypeText
objStream.Open
' write bytes into stream
objStream.WriteText strText
objStream.Flush
' rewind stream and read text
objStream.Position = 0
objStream.Type = adTypeBinary
objStream.Read 3 ' skip first 3 bytes as this is the utf-8 marker
data = objStream.Read()
' close up and return
objStream.Close
ConvertStringToUtf8Bytes = data
End Function

A voir également
Ce document intitulé « Comm WinSock VB6 <-> VB.Net (Encoding, UTF-8, Unicode) » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous