Arn*_*aud 6 c++ boost boost-system
我正在使用 boost-asio,我想正确处理错误消息。
在这个例子中,我打错了字(1278 而不是 127):
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 ?
}
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息,它似乎是在 Windows 1252 中编码的(我使用的是 Windows 7)。所以看起来编码是操作系统编码。
但是,我找不到任何说明这一事实的文件。
boost asio 中的错误消息是否使用操作系统字符集进行编码?
在深入研究我的系统上的 boost 后,我发现包含的 hpp 文件包含一个 ipp 文件,该文件又调用操作系统函数。如果出现错误,此时仅知道错误的代码。
真正的错误消息是在调用message()函数时形成的。
Windows 上的实现调用 FormatMessageA 或 FormatMessageW,具体取决于是否定义了 BOOST_NO_ANSI_APIS:
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;
}
Run Code Online (Sandbox Code Playgroud)
如果消息调用 FormatMessageW,则字符串将缩小回系统默认的 Windows ANSI 代码页 (CP_ACP)
在 Windows 上的所有情况下,结果都是默认的 ANSI 代码页。
| 归档时间: |
|
| 查看次数: |
1179 次 |
| 最近记录: |