2014-01-17 34 views
1

我通過C#套接字發送西里爾語文本「УБА221」有問題。它轉向「#xxxxx221」。這裏是xxxxx是5個奇怪的字母,我不能複製粘貼。通過Socket發送西裏爾字母文本?

服務器端(接收端):

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

我將UTF32更改爲UTF8。但仍然沒有工作。我將稍後嘗試Encoding.UTF8.GetString(bytes,0,bytesToDecode)。 – user3145861

回答

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,因爲它存儲了「尚未解碼的數據」的狀態。
+0

我得到每個插座讀取週期1個字符。上面的接收代碼在OnDataReceived中。我如何閱讀整個字符串? – user3145861

+0

@ user3145861:我們不知道你的接聽電話是什麼樣的 - 請在問題中加入。你將無法假設你會一口氣讀完整個字符串,請注意,這不是流式協議的工作方式。 (我們也不知道您使用的是什麼更高級別的協議 - 您是否想繼續閱讀,直到另一方關閉套接字,或者您有什麼需要指出消息何時完成?) –