Senden einer Zeichenfolge mit Sonderzeichen durch ein TcpClient (byte[])
Ich versuche zu senden, einen string mit Sonderzeichen durch ein TcpClient (byte[]). Hier ist ein Beispiel:
- Kunde "amé" in eine textbox
- Client konvertiert string zu byte[] mittels einer bestimmten Kodierung (ich habe versucht, alle der vordefinierten ones, plus some like "iso-8859-1")
- Client sendet byte[] durch TCP
- - Server empfängt und Ausgänge die string zurückverwandelt, mit der gleichen Codierung (ein Listenfeld)
Edit :
Ich vergaß zu erwähnen, dass der resultierende string war "bin?".
Bearbeiten-2 (wie gewünscht, hier ein paar code):
@DJKRAZE hier ist ein bisschen code :
byte[] buffer = Encoding.ASCII.GetBytes("amé");
(TcpClient)server.Client.Send(buffer);
Auf der server-Seite:
byte[] buffer = new byte[1024];
Client.Recieve(buffer);
string message = Encoding.ASCII.GetString(buffer);
ListBox1.Items.Add(message);
Die Zeichenfolge, die angezeigt wird in der listbox "bin?"
=== Lösung ===
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
byte[] message = encoding.GetBytes("babé");
Update:
Einfach mit Encoding.Utf8.GetBytes("ééé");
funktioniert wie ein Charme.
Philippe Sie haben vorhandenen code.. ? warum ist es, dass die Menschen Fragen stellen Sie hier online und erwarten, dass wir wissen, was es ist, Sie reden..? wir können nicht sehen, was Sie tun, wir wissen auch nicht, was dein code aussieht.. also nach, was es ist, Sie arbeiten mit...
Eine Fehlermeldung und/oder die falschen Ergebnisse, die Sie sehen, würde auch helfen.
hier ist ein bisschen code : byte[] buffer = Encoding.ASCII.GetBytes("amé"); (TcpClient)server.Client.Send(buffer); Auf der server-Seite: byte[] buffer = new byte[1024]; Client.Receive(buffer); string Nachricht = Encoding.ASCII.GetString(buffer); ListBox1.Elemente.Add(message); Die Zeichenfolge, die angezeigt wird in der listbox "bin?"
Ähnlicher Eintrag: stackoverflow.com/questions/2595442/...
ASCII wird nicht hier tun - es spielt keine Unterstützung für Zeichen mit Akzent. Versuchen UTF-8 statt.
Eine Fehlermeldung und/oder die falschen Ergebnisse, die Sie sehen, würde auch helfen.
hier ist ein bisschen code : byte[] buffer = Encoding.ASCII.GetBytes("amé"); (TcpClient)server.Client.Send(buffer); Auf der server-Seite: byte[] buffer = new byte[1024]; Client.Receive(buffer); string Nachricht = Encoding.ASCII.GetString(buffer); ListBox1.Elemente.Add(message); Die Zeichenfolge, die angezeigt wird in der listbox "bin?"
Ähnlicher Eintrag: stackoverflow.com/questions/2595442/...
ASCII wird nicht hier tun - es spielt keine Unterstützung für Zeichen mit Akzent. Versuchen UTF-8 statt.
InformationsquelleAutor Philippe Paré | 2013-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nie zu spät, eine Frage zu beantworten, ich denke, hoffe, jemand wird Antworten finden Sie hier.
C# verwendet 16-bit-Zeichen, und die ASCII-schneidet Sie in 8-bit, passen in ein byte. Nach einigen Recherchen fand ich UTF-8 zu sein, die beste Codierung für spezielle Zeichen.
Nein. C#'s
char
Daten-Typ enthält ein UTF-16-code-unit, ein oder zwei von denen encode-Unicode-codepoint. UTF-8 codiert Unicode-codepoint in 1 bis 4 bytes. Es ist egal welche Codierung Sie verwenden, solange Sie das gleiche auf beiden Seiten und die Codierung nicht dazu führen, dass Sie verlieren Daten von nicht in der Lage zur Darstellung der Zeichen, die Sie benötigen. Wenn es nicht kann, GetBytes() werden einige Maßnahmen ergreifen. Die standard-Aktion ist zu ersetzen "?"; Eine Ausnahme ist auch üblich, Abschneiden ist nicht Häufig, aber Sie könnte code, dass, wenn Sie wollte, zur Beschädigung von Daten führen.Scott, klar hatte ich etwas anderes falsch über den code. Utf-8-Codierung funktioniert perfekt, wenn verwendet, auf beiden Seiten. Ich aktualisierte die Frage so, dass die Leute nicht bekommen, getäuscht, mit mir zu sagen, das Sie utf-8 nicht funktioniert.
Tom, was ich sagen wollte ist, dass aber C# speichert der char selbst, es ist 2 bytes und dafür, ascii hilft nicht gegen spécial Zeichen wie "é"
und was Tom sagt, ist C# verwendet intern in UTF-16 werden könnte, 2 oder 4 bytes groß ist. Zum Beispiel
U+1D11E
(MUSICAL SYMBOL G CLEF) darstellbar ist, aber es wäre die vier bytes, dieD8 34 DD 1E
im Speicher.InformationsquelleAutor Philippe Paré
Dein problem scheint zu sein, die
Encoding.ASCII.GetBytes("amé");
undEncoding.ASCII.GetString(buffer);
- Aufrufe, wie angedeutet, durch '500 - Internal Server Error' in seinem Kommentar.Den
é
Charakter ist ein multi-byte-Zeichen, die codiert in UTF-8 mit byte-SequenzC3 A9
. Wenn Sie dieEncoding.ASCII
Klasse zum codieren und decodieren, dieé
Charakter wird in ein Fragezeichen, da es nicht direkt die ASCII-Kodierung. Dies gilt für alle Zeichen, die keine direkte Kodierung in ASCII.Ändern Sie Ihren code so verwenden
Encoding.UTF8.GetBytes()
undEncoding.UTF8.GetString()
und es sollte für Sie arbeiten.InformationsquelleAutor Corey
Deine Frage und dein Fehler ist mir nicht klar, aber mit
Base64String
können, das problem zu lösenSo etwas
Okay! Einen Weg gefunden, um dieses riesige problem. Ich bin jetzt mit dem "iso-8859-1" - Codierung. Hier ist ein Stück code, der für alle interessierten in der Zukunft. Encoding encoding = Encoding.GetEncoding("iso-8859-1"); byte[] message = encoding.GetBytes("babé"); Das Ergebnis der server-Seite : "babé" ! Trotzdem danke für alle Antworten 🙂
InformationsquelleAutor Mohsen Heydari