разрешение сетевого узла с использованием boost::asio и std::wstring

Я использую Boost::Asio для связи по сети. Следующий код завершается со следующей ошибкой компиляции.

Код:

std::wstring hostName(L"myserver");
std::wstring portName(L"myport");
auto query = boost::asio::ip::udp::resolver::query(boost::asio::ip::udp::v4(), hostName, portName);

Ошибка компиляции:

Error   1   error C2665: 'boost::asio::ip::basic_resolver_query<InternetProtocol>::basic_resolver_query' :
none of the 5 overloads could convert all the argument types    

Мои вопросы:

  • Ожидает ли Boost::Asio только ANSI-строки (std::string)?
  • Означает ли это, что имена хостов с символами, отличными от ANSI, не поддерживаются?
  • Или мне нужно сначала преобразовать мои широкие строки в UTF8?
  • И в последнем случае, предоставляет ли Boost::Asio стандартные методы для этого, или я могу использовать свои собственные процедуры преобразования ANSI/Unicode?

В настоящее время работает в Windows, используя Visual Studio 2013.

Заранее спасибо.


person Patrick    schedule 22.02.2016    source источник


Ответы (1)


Будет ли Boost::Asio ожидать только ANSI-строки (std::string)? Ожидается std::string, но не обязательно ANSI, поскольку std::string может хранить UTF-8.

Означает ли это, что имена хостов с символами, отличными от ANSI, не поддерживаются? Я лично не пробовал, но, поскольку это по сути оболочка поверх базового сетевого кода ОС, я не могу найти по какой-либо причине он не поддерживает использование UTF-8.

Или мне нужно сначала преобразовать мои широкие строки в UTF8? Скорее всего, да, поскольку формат широких строк используется только основными API-интерфейсами Windows, а UTF-8 используется всеми остальными, включая Boost.

И в последнем случае, предоставляет ли Boost::Asio стандартные методы для этого, или я могу использовать свои собственные процедуры преобразования ANSI/Unicode? Похоже, что Boost не поддерживает широкоформатные символы. Пока вы используете специфичную для Windows кодировку символов, вы можете либо использовать COM-интерфейсы, предоставляемые Windows для преобразования (MultiByteToWideChar, WideCharToMultiByte), либо использовать свои собственные подпрограммы. Если известно, что ваши собственные подпрограммы надежны/правильны, и вы еще не используете COM, вы можете придерживаться своих собственных, а не добавлять зависимость от COM в свой проект.

person Matt Jordan    schedule 22.02.2016