L'envoi d'une chaîne de caractères contenant des caractères spéciaux par le biais d'un TcpClient (byte[])
Je suis en train d'envoyer une chaîne de caractères contenant des caractères spéciaux par le biais d'un TcpClient (byte[]). Voici un exemple:
- Client entre "amé" dans une zone de texte
- Client convertit une chaîne d'octets[] à l'aide d'un certain encodage (j'ai essayé tous les prédéfinis, ainsi que certains comme la "iso-8859-1")
- Client envoie byte[] par l'intermédiaire de TCP
- Serveur reçoit et sorties de la chaîne de reconversion avec le même encodage (pour une zone de liste)
Edit :
J'ai oublié de mentionner que la chaîne résultante a été "suis?".
Edit-2 (comme demandé, voici un peu de code):
@DJKRAZE voici un peu de code :
byte[] buffer = Encoding.ASCII.GetBytes("amé");
(TcpClient)server.Client.Send(buffer);
Sur le côté serveur:
byte[] buffer = new byte[1024];
Client.Recieve(buffer);
string message = Encoding.ASCII.GetString(buffer);
ListBox1.Items.Add(message);
La chaîne qui s'affiche dans la zone de liste est "suis?"
=== Solution ===
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
byte[] message = encoding.GetBytes("babé");
Mise à jour:
Simplement à l'aide de Encoding.Utf8.GetBytes("ééé");
fonctionne comme un charme.
Philippe vous avez déjà un code.. ? pourquoi est-ce que les gens de poser des questions en ligne ici et attendez-nous savoir ce que c'est qu'ils sont d'en parler..? nous ne pouvons pas voir ce que vous faites et nous ne savons ce que votre code ressemble.. donc, après ce que vous travaillez avec...
Un message d'erreur et/ou si les mauvais résultats que vous voyez aiderait aussi.
voici un peu de code : byte[] buffer = Encodage.ASCII.GetBytes("amé"); (TcpClient)du serveur.Client.Envoyer(buffer); Sur le côté serveur: byte[] buffer = new byte[1024]; Client.Recevoir(buffer); string message = Encodage.ASCII.GetString(buffer); ListBox1.Éléments.Ajouter(message); La chaîne qui s'affiche dans la zone de liste est "suis?"
Similaire post: stackoverflow.com/questions/2595442/...
ASCII ne vais pas faire ici - il ne supporte pas les caractères accentués. Essayez UTF-8 à la place.
Un message d'erreur et/ou si les mauvais résultats que vous voyez aiderait aussi.
voici un peu de code : byte[] buffer = Encodage.ASCII.GetBytes("amé"); (TcpClient)du serveur.Client.Envoyer(buffer); Sur le côté serveur: byte[] buffer = new byte[1024]; Client.Recevoir(buffer); string message = Encodage.ASCII.GetString(buffer); ListBox1.Éléments.Ajouter(message); La chaîne qui s'affiche dans la zone de liste est "suis?"
Similaire post: stackoverflow.com/questions/2595442/...
ASCII ne vais pas faire ici - il ne supporte pas les caractères accentués. Essayez UTF-8 à la place.
OriginalL'auteur Philippe Paré | 2013-02-26
Vous devez vous connecter pour publier un commentaire.
N'est jamais trop tard pour répondre à une question que je pense, j'espère que quelqu'un va trouver des réponses ici.
C# utilise 16 bits caractères, ASCII et tronque à 8 bits, pour s'adapter dans un octet. Après quelques recherches, j'ai trouvé l'UTF-8 pour être le meilleur encodage des caractères spéciaux.
Pas de. C#'s
char
type de données contient un code UTF-16, un ou deux de qui codent pour une Unicode codepoint. UTF-8 code Unicode codepoint de 1 à 4 octets. Il n'est pas question que l'encodage que vous utilisez aussi longtemps que vous utilisez le même sur les deux côtés et le codage de ne pas vous faire perdre des données en n'étant pas en mesure de représenter les caractères dont vous avez besoin. Si il ne peut pas, GetBytes() va prendre des mesures. L'action standard est de remplacer "?"; Lancer une exception est également fréquent; la Troncature n'est pas commun, mais vous pourriez le code de cette façon, si vous voulais entraîner la corruption des données.Scott, clairement, j'avais autre chose de mauvais sur le code. L'encodage Utf-8 fonctionne parfaitement lorsqu'il est utilisé sur les deux côtés. J'ai mis à jour la question, de sorte que les gens ne comprennent pas trompé avec moi en disant l'utf-8 ne fonctionne pas.
Tom, ce que je voulais dire, c'est que, cependant, C# stocke le char lui-même, c'est de 2 octets et à cet effet, le code ascii ne permet pas de spécial caractères comme "é"
et ce que dis Tom C# utilise l'UTF-16 en interne qui pourrait être 2 ou 4 octets la taille. Par exemple
U+1D11E
(SYMBOLE MUSICAL CLÉ de sol) est représentable, mais il serait les quatre octetsD8 34 DD 1E
dans la mémoire.OriginalL'auteur Philippe Paré
Votre problème semble être le
Encoding.ASCII.GetBytes("amé");
etEncoding.ASCII.GetString(buffer);
appels, comme signalé par '500 - Erreur Interne du Serveur" dans ses commentaires.La
é
personnage est un de caractères multi-octets qui est encodé en UTF-8 avec la séquence d'octetsC3 A9
. Lorsque vous utilisez leEncoding.ASCII
classe pour coder et décoder, leé
caractère est converti en point d'interrogation, car il n'est pas directement le codage ASCII. Cela est vrai de n'importe quel caractère qui n'a aucun codage en ASCII.Modifiez votre code pour utiliser
Encoding.UTF8.GetBytes()
etEncoding.UTF8.GetString()
et cela devrait fonctionner pour vous.OriginalL'auteur Corey
De votre question et de votre erreur n'est pas clair pour moi, mais à l'aide de
Base64String
peut résoudre le problèmeQuelque chose comme ceci
Bien! Trouvé un moyen de contourner ce problème énorme. Je suis maintenant à l'aide de la "iso-8859-1" encoding. Voici un peu de code pour quiconque s'intéresse à l'avenir. Encoding = Encodage.GetEncoding("iso-8859-1"); byte[] message = encodage.GetBytes("babé"); Le résultat côté serveur : "babé" ! Merci de toute façon pour toutes les réponses 🙂
OriginalL'auteur Mohsen Heydari