我遇到通过C#套接字发送西里尔文“УБА221”的问题。它转向“#xxxxx221”。这是xxxxx是5个奇怪的字母我不能复制粘贴。
服务器端(接收方):
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.thisSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
System.String szData = new System.String(chars);
TextLabel.Text =TextLabel.Text+ szData;
客户端(发送):
subtext = "УБА221";
byte[] byData = System.Text.Encoding.UTF8.GetBytes(subtext);
socket.Send(byData);
有什么想法我的代码无效吗?
答案 0 :(得分:2)
看看你如何对文本进行编码以发送它:
byte[] byData = System.Text.Encoding.UTF32.GetBytes(subtext);
现在看看你如何将二进制数据解码回文本:
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
您使用UTF-32进行编码,使用UTF-8进行解码。那不行。您需要在两侧使用相同的编码。
另请注意:
BeginReceive/EndReceive
电话中收到全文Encoding.UTF8.GetString(bytes, 0, bytesToDecode)
而不是通过Decoder
。Decoder
,但您会需要在读取调用之间保留Decoder
,因为它存储“尚未解码的数据”的状态。