2013-10-10 53 views
3

我正在嘗試使用simplejson和Json.NET在Python服務器和C#客戶端之間建立一個非常基本的基於ZeroMQ的套接字鏈接。 我嘗試從Python發送一個字典並將其讀入C#中的一個對象。 Python代碼:從Python到C#的套接字消息通過亂碼出現

message = {'MessageType':"None", 'ContentType':"None", 'Content':"OK"} 
message_blob = simplejson.dumps(message).encode(encoding = "UTF-8") 
alive_socket.send(message_blob) 

的消息被作爲正常UTF-8字符串,或者,如果我使用UTF-16,爲「'\ XFF \ XFE {\ X00 「\ X00 ...」 等

代碼在C#是我的問題是:

string reply = client.Receive(Encoding.UTF8); 

的UTF-8的消息被接收爲「≻潃瑮湥≴> ...」等

我試圖用UTF-16並且消息通過確定,但是第一個符號仍然是little-endian \ xFF \ xFE BOM所以,當我嘗試將其提供給解串器,

PythonMessage replyMessage = JsonConvert.DeserializeObject<PythonMessage>(reply); 
//PythonMessage is just a very simple class with properties, 
//not relevant to the problem 

我得到一個錯誤(顯然發生在第一個符號,\ XFF):

Unexpected character encountered while parsing value: . 

東西是在我的方式顯然是錯誤的m使用編碼。你能告訴我正確的做法嗎?

+0

您是否嘗試發送一個簡單的字符串,而不是字典?那工作? – raffian

+0

如果我像編碼轉儲()的結果一樣對它進行編碼,那就是一樣的。 –

+0

這是什麼'Receive'方法? Socket.Receive是否只接受字節數組?什麼是'客戶端'? – Joni

回答

1

字節順序標記在UTF-16中是強制性的。您可以使用UTF-16LE或UTF-16BE假定特定的字節順序,並且不會生成BOM。也就是說,使用:

message_blob = simplejson.dumps(message).encode(encoding = "UTF-16le") 
+0

我的印象是,FFFE是little-endian的BOM下? –

+0

我想問題是,你如何讓DeserializeObject正確使用UTF-16字符串?我應該把它轉換爲UTF-8(如果是的話,怎麼樣?)或者丟掉兩個第一個字節?後者似乎對我完全錯誤。 TIA! –

+0

你說得對,我把它倒過來了,U + feff是零寬度的空格字符(用作bom),而\ xff \ xfe是小序列號 – Joni

相關問題