Из C ++ wchar_t в C # char через сокет
-
09-09-2019 - |
Вопрос
В настоящее время я создаю приложение на C ++, которое взаимодействует через сокет с приложением на C #.Мое приложение на C ++ отправляет wchar_t * через сокет.
Вот обзор того, что такое отправить :
<!-- Normal xml file--
Вот что я получаю с другой стороны (я выполняю stream.read в массив байтов и использую UTF8Encoding.getString() для преобразования массива байтов в читаемую строку)
<\0!\0-\0-\0 \0N\0o\0r\0m\0a\0l\0 \0x\0m\0l\0 \0f\0i\0l\0e\0-\0-
Это проблема с сортировкой?Что ты на это скажешь?Почему оно расширено на 0 и почему символ unicode не отображается на стороне C #?
Решение
Похоже, что он отправляет UTF-16, а не UTF-8, что имеет смысл - wchar_t
в основном это 16-разрядный тип (в Windows), и вы отправляете его в "сыром виде", насколько я могу судить.Я полагаю, что если вы собираетесь преобразовать данные в XDocument
или XmlDocument
, вы делаете это с двоичными данными - фреймворк знает, как автоматически определять UTF-16 для XML-файлов (IIRC).
У вас потенциально возникнут проблемы, если в объявлении XML будет указано, что это UTF-8, хотя на самом деле это UTF-16.
В качестве альтернативы, используйте подходящие классы кодирования на стороне C ++, чтобы искренне отправьте UTF-8.Это заняло бы дополнительное время обработки, но обычно экономит пропускную способность, если это необходимо.