De wchar_t C ++ para C # caractere através da tomada
-
09-09-2019 - |
Pergunta
Atualmente, estou construindo uma aplicação C ++ que se comunicam através da tomada de uma aplicação C #. Meu aplicativo C ++ envia * wchar_t via socket.
Aqui está uma visão geral do que é enviar:
<!-- Normal xml file--
Aqui está o que eu recebo do outro lado (eu faço um stream.read para um array de bytes e uso UTF8Encoding.GetString () para converter a matriz de bytes para uma string legível)
<\0!\0-\0-\0 \0N\0o\0r\0m\0a\0l\0 \0x\0m\0l\0 \0f\0i\0l\0e\0-\0-
É um problema de empacotamento? O que você disse? Por que é 0 estendida e por unicode caracter não aparecer no lado do C #?
Solução
Parece que ele está enviando UTF-16, não UTF-8, o que faz sentido - wchar_t
é basicamente um tipo de 16 bits (no Windows), e você está enviando-o para baixo "raw", tanto quanto eu posso dizer. Eu sugiro que se você estiver indo para converter os dados em um XDocument
ou XmlDocument
, você fazê-lo com os dados binários - o quadro sabe como detectar automaticamente UTF-16 para arquivos XML (IIRC)
Você vai potencialmente ter problemas se a declaração XML declara ser UTF-8 quando é realmente UTF-16 embora.
Em alternativa, utilizar as classes de codificação adequados no lado do C ++ para genuinamente envio UTF-8. Isso levaria tempo de processamento extra, mas geralmente economizar largura de banda, se isso é uma consideração.