2009-06-03 10 views
2

Ich baue derzeit eine C++ - Anwendung, die über Socket zu einer C# -Anwendung kommunizieren. Meine C++ App sendet wchar_t * über Socket.Von C++ wchar_t zu C# char über Socket

Hier eine Übersicht von dem, was senden ist:

<!-- Normal xml file-- 

Hier ist, was ich auf der anderen Seite empfangen (I eine stream.read zu einem Byte-Array zu tun und UTF8Encoding.GetString() verwenden, um zu konvertieren das Byte-Array zu einer lesbaren Zeichenfolge)

<\0!\0-\0-\0 \0N\0o\0r\0m\0a\0l\0 \0x\0m\0l\0 \0f\0i\0l\0e\0-\0- 

Ist es ein Marshalling-Problem? Was sagst du? Warum wird 0 erweitert und warum erscheint Unicode-Zeichen nicht auf der C# -Seite?

Antwort

5

Sieht aus, als sende UTF-16, nicht UTF-8, was Sinn macht - wchar_t ist im Grunde ein 16-Bit-Typ (in Windows), und Sie senden es "roh" so weit wie ich sagen kann . Ich schlage vor, dass wenn Sie die Daten in eine XDocument oder XmlDocument konvertieren, Sie es mit den binären Daten tun - das Framework weiß, wie UTF-16 für XML-Dateien (IIRC) automatisch erkennen.

Sie haben möglicherweise Probleme, wenn die XML-Deklaration UTF-8 deklariert, obwohl es wirklich UTF-16 ist.

Alternativ verwenden Sie geeignete Codierungsklassen auf der C++ Seite zu wirklich UTF-8 senden. Dies würde zusätzliche Verarbeitungszeit erfordern, aber normalerweise Bandbreite sparen, wenn dies berücksichtigt wird.