Я понимаю из этот а также этот Поток, что в Windows, wchar_t является 16-битным & для Linux wchar_t является 32-битным.
У меня есть клиент-серверная архитектура (использующая только каналы, а не сокеты), где мой сервер основан на Windows, а клиент — на Linux.
Сервер имеет API для получения имени хоста от клиента. Когда клиент основан на Windows, он может просто выполнить GetComputerNameW и вернуть Wide-String.
Однако, когда клиент основан на Linux, все становится грязно.
В качестве первого наивного подхода я использовал mbstowcs (), надеясь вернуть wchar_t * на стороне сервера Windows.
Однако этот LPWSTR (у меня typedef wchar_t * LPWSTR на моей стороне Linux linet) не распознается в Windows, так как он ожидает, что его wchar_t будет 16-битным.
Итак, преобразование вывода gethostname () в linux — который находится в char * в unsigned short (16-bit) — мой единственный вариант?
Заранее спасибо!
Вам придется определиться с действующим протоколом о том, как передавать данные по проводам. Здесь есть несколько вариантов, хотя, вероятно, UTF-8, как правило, наиболее разумный — это также означает, что в Linux вы можете просто использовать данные «как есть» (нет причин использовать wchar_t для начала, хотя вы, очевидно, можете конвертировать их во что угодно. хочу).
Под Windows вам придется конвертировать UTF-8 в UTF-16 (да, не совсем, но да ладно), в какие окна хочет, и если вы хотите отправить данные, вы должны конвертировать их в UTF-8. К счастью, Windows предоставляет этот соответственно этот функционировать именно для этих целей.
Очевидно, что вы можете выбрать любую кодировку, которую вы хотите не обязательно UTF-8, процесс тот же: при получении данных преобразуйте их в собственный формат ОС, при отправке преобразуйте их в вашу кодировку по проводам. Iconv работает на Linux, если вы не используете UTF-8.
Лучше всего выбрать стандартную кодировку символов для данных, отправляемых по каналу, а затем потребовать, чтобы все машины отправляли свои данные с использованием этой кодировки.
Windows использует UTF-16LE, поэтому вы можете выбрать использование UTF-16LE по каналу, и тогда машины Windows могут отправлять свои строки в кодировке UTF-16LE как есть, но машины Linux должны будут преобразовывать в / из UTF-16LE по мере необходимости.
Или вы могли бы выбрать UTF-8 вместо этого, что уменьшило бы пропускную способность сети, но как Windows, так и Linux-машины должны были бы конвертировать в / из UTF-8 по необходимости. Для сетевых коммуникаций UTF-8 будет лучшим выбором.
В Windows вы можете использовать MultiByteToWideChar()
а также WideCharToMultiByte()
с CP_UTF8
кодовая.
В Linux используйте iconv()
API, так что вы можете указать кодировку UTF-8 для кодирования / декодирования.