Fix support for wchar to utf8 under windows (fix issue #851 and #764)

This commit is contained in:
gabime 2018-10-02 18:27:49 +03:00
parent 17702969fa
commit 8b42b7d269
2 changed files with 31 additions and 14 deletions

View File

@ -175,6 +175,29 @@ inline void spdlog::logger::critical(const T &msg)
}
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
static_assert(_WIN32, "SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows");
inline void wbuf_to_utf8buf(const fmt::wmemory_buffer &wbuf, fmt::memory_buffer &target)
{
int wbuf_size = static_cast<int>(wbuf.size());
if (wbuf_size == 0)
{
return;
}
auto result_size = ::WideCharToMultiByte(CP_UTF8, 0, wbuf.data(), wbuf_size, NULL, 0, NULL, NULL);
if (result_size > 0)
{
target.resize(result_size);
::WideCharToMultiByte(CP_UTF8, 0, wbuf.data(), wbuf_size, &target.data()[0], result_size, NULL, NULL);
}
else
{
throw spdlog::spdlog_ex("Failed converting to utf8", errno);
}
}
template<typename... Args>
inline void spdlog::logger::log(level::level_enum lvl, const wchar_t *fmt, const Args &... args)
{
@ -183,15 +206,14 @@ inline void spdlog::logger::log(level::level_enum lvl, const wchar_t *fmt, const
return;
}
decltype(wstring_converter_)::byte_string utf8_string;
try
{
{
std::lock_guard<std::mutex> lock(wstring_converter_mutex_);
utf8_string = wstring_converter_.to_bytes(fmt);
}
log(lvl, utf8_string.c_str(), args...);
// format to wmemory_buffer and convert to utf8
details::log_msg log_msg(&name_, lvl);
fmt::wmemory_buffer wbuf;
fmt::format_to(wbuf, fmt, args...);
wbuf_to_utf8buf(wbuf, log_msg.raw);
sink_it_(log_msg);
}
SPDLOG_CATCH_AND_HANDLE
}

View File

@ -25,6 +25,7 @@
#include <memory>
#include <string>
#include <vector>
#include <locale>
namespace spdlog {
@ -146,8 +147,7 @@ protected:
// message/minute
void default_err_handler_(const std::string &msg);
// increment the message count (only if
// defined(SPDLOG_ENABLE_MESSAGE_COUNTER))
// increment the message count (only if defined(SPDLOG_ENABLE_MESSAGE_COUNTER))
void incr_msg_counter_(details::log_msg &msg);
const std::string name_;
@ -157,11 +157,6 @@ protected:
log_err_handler err_handler_;
std::atomic<time_t> last_err_time_;
std::atomic<size_t> msg_counter_;
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
std::wstring_convert<std::codecvt_utf8<wchar_t>> wstring_converter_;
std::mutex wstring_converter_mutex_;
#endif
};
} // namespace spdlog