【问题标题】:Send Cyrillic text through Socket?通过 Socket 发送西里尔文字?
【发布时间】:2014-01-17 09:44:46
【问题描述】:

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

知道为什么我的代码不起作用吗?

【问题讨论】:

  • 我把 UTF32 改成了 UTF8。但仍然无法正常工作。稍后我将尝试 Encoding.UTF8.GetString(bytes, 0, bytesToDecode)。

标签: c# sockets unicode


【解决方案1】:

看看你是如何编码文本来发送的:

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

【讨论】:

  • 每个套接字读取周期我得到 1 个字符。上面的接收代码在 OnDataReceived 里面。如何读取整个字符串?
  • @user3145861:嗯,我们不知道您的接听电话是什么样的 - 请在问题中包括这一点。请注意,你不能假设你会一口气读完整个字符串——这不是流协议的工作方式。 (我们也不知道您使用的是什么更高级别的协议——您是想继续阅读直到对方关闭套接字,还是您有什么东西可以指示消息何时完成?)
猜你喜欢
  • 2011-06-11
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多