通过Socket发送西里尔文本?

时间:2014-01-17 09:44:47

标签: c# sockets unicode

我遇到通过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);

有什么想法我的代码无效吗?

1 个答案:

答案 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,因为它存储“尚未解码的数据”的状态。