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

时间:2016-02-22 17:07:02

标签: c++ visual-studio-2013 unicode boost-asio 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-strings(std :: string)?
  • 这是否意味着不支持具有非ANSI字符的主机名?
  • 或者我必须先将我的宽字符串转换为UTF8吗?
  • 在后一种情况下,Boost :: Asio是否提供了标准方法来执行此操作,还是可以使用自己的ANSI / Unicode转换例程?

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

Boost :: Asio是否只需要ANSI-strings(std :: string)?它需要std :: string,但不一定是ANSI,因为std :: string可以存储UTF-8。

这是否意味着不支持具有非ANSI字符的主机名?我没有亲自尝试过,但由于这本质上是基础操作系统网络代码之上的包装器,我可以找不到使用UTF-8的任何理由。

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

在后一种情况下,Boost :: Asio是否提供了标准方法来执行此操作,还是可以使用自己的ANSI / Unicode转换例程? Boost似乎不支持wide-char。只要您使用Windows特定的字符编码,就可以使用Windows提供的COM接口进行转换(MultiByteToWideChar,WideCharToMultiByte),或使用您自己的例程。如果您知道自己的例程是可靠/正确的,并且您还没有使用COM,那么您可能希望坚持使用自己的例程,而不是在项目中添加对COM的依赖。