首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost-asio错误消息所使用的编码是什么?

boost-asio错误消息所使用的编码是什么?
EN

Stack Overflow用户
提问于 2013-08-28 13:51:39
回答 1查看 1.5K关注 0票数 6

我正在使用boost-asio,我想正确地处理错误消息。

在这个例子中,我做了一个错误(1278而不是127):

代码语言:javascript
复制
boost::system::error_code ec;
auto address=boost::asio::ip::address::from_string("1278.0.0.1",ec);
if(ec)
{
    auto text=ec.message();
    //Do Something with text but what is its encoding ?
}

我收到一条错误消息,它似乎是在Windows 1252中编码的(我使用的是Windows 7)。因此,似乎编码就是OS编码。

然而,我找不到任何文件来说明这一事实。

boost asio中的错误消息是否用OS字符集编码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-29 09:00:43

在深入研究我的系统上的boost之后,我发现包含的hpp文件包含一个ipp文件,它反过来调用OS函数。如果存在错误,此时只知道错误的代码。

真正的错误消息是在调用message()函数时形成的。

windows上的实现调用FormatMessageA或FormatMessageW,这取决于是否定义了BOOST_NO_ANSI_APIS:

代码语言:javascript
复制
  std::string system_error_category::message( int ev ) const
  {
# ifndef BOOST_NO_ANSI_APIS  
    LPVOID lpMsgBuf = 0;
    DWORD retval = ::FormatMessageA( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        ev,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPSTR) &lpMsgBuf,
        0,
        NULL 
    );
    detail::local_free_on_destruction lfod(lpMsgBuf);
    if (retval == 0)
        return std::string("Unknown error");

    std::string str( static_cast<LPCSTR>(lpMsgBuf) );
# else  // WinCE workaround
    LPVOID lpMsgBuf = 0;
    DWORD retval = ::FormatMessageW( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        ev,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPWSTR) &lpMsgBuf,
        0,
        NULL 
    );
    detail::local_free_on_destruction lfod(lpMsgBuf);
    if (retval == 0)
        return std::string("Unknown error");

    int num_chars = (wcslen( static_cast<LPCWSTR>(lpMsgBuf) ) + 1) * 2;
    LPSTR narrow_buffer = (LPSTR)_alloca( num_chars );
    if (::WideCharToMultiByte(CP_ACP, 0, static_cast<LPCWSTR>(lpMsgBuf), -1, narrow_buffer, num_chars, NULL, NULL) == 0)
        return std::string("Unknown error");

    std::string str( narrow_buffer );
# endif
    while ( str.size()
      && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') )
        str.erase( str.size()-1 );
    if ( str.size() && str[str.size()-1] == '.' ) 
      { str.erase( str.size()-1 ); }
    return str;
  }

如果消息调用FormatMessageW,则将字符串缩小到系统默认的Windows代码页(CP_ACP)。

在Windows上的所有情况下,结果都是默认的ANSI代码页。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18489893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档