【问题标题】:resolving network node using boost::asio and an std::wstring使用 boost::asio 和 std::wstring 解析网络节点
【发布时间】:2016-06-04 05:33:13
【问题描述】:

我正在使用 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。

提前致谢。

【问题讨论】:

    标签: c++ visual-studio-2013 unicode boost-asio wstring


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 2016-06-07
      • 1970-01-01
      • 2014-10-23
      • 2011-08-24
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多