3

simplejson と Json.NET を使用して、Python サーバーと C# クライアントの間に非常に基本的な ZeroMQ ベースのソケット リンクを設定しようとしています。Python から dict を送信して、C# のオブジェクトに読み込もうとしています。Python コード:

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 を使用しようとすると、メッセージは OK で表示されますが、最初のシンボルはまだリトルエンディアンの \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: .

エンコーディングの使用方法に明らかに問題があります。これを行う正しい方法を教えてください。

4

1 に答える 1

1

UTF-16 では byte-order-mark は必須です。UTF-16LE または UTF-16BE を使用して特定のバイト順を想定すると、BOM は生成されません。つまり、次を使用します。

message_blob = simplejson.dumps(message).encode(encoding = "UTF-16le")
于 2013-10-11T07:02:11.377 に答える