使用 boost::asio 和 std::wstring 解析网络节点

resolving network node using boost::asio and an 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    

我的问题:

目前 运行 Windows,使用 Visual Studio 2013。

提前致谢。

是否 Boost::Asio 仅期望 ANSI 字符串 (std::string)? 它期望 std::string,但不一定是 ANSI,因为 std::string可以存储UTF-8.

这是否意味着不支持具有非 ANSI 字符的主机名?我没有亲自尝试过,但是因为这本质上是底层 OS 网络代码,我找不到它不支持使用 UTF-8 的任何理由。

或者我是否必须先将我的宽字符串转换为 UTF8? 很可能,是的,因为宽字符串格式仅由核心 Windows API 使用,而 UTF-8 被其他人使用,包括 Boost。

在后一种情况下,Boost::Asio 是否提供了执行此操作的标准方法,或者我可以使用自己的 ANSI/Unicode 转换例程吗? Boost 没有似乎不支持宽字符。只要您使用 Windows 特定的字符编码,就可以使用 Windows 提供的 COM 接口进行转换(MultiByteToWideChar、WideCharToMultiByte),或者使用您自己的例程。如果已知您自己的例程是 reliable/correct,并且您尚未使用 COM,则您可能希望坚持使用自己的例程,而不是将对 COM 的依赖项添加到您的项目中。