需要澄清的是,我不是过度担心数据丢失问题,因为这是用于记录应用程序内操作的日志,我使用wstring作为主要的数据类型。由于我目前使用的框架(默认情况下为std :: string的OpenFrameworks日志记录),所以我对此感到满意。
以下是当前转换示例:
//ofLog.h--patch | `message` is a `std::ostringstream`
ofLog& operator<<(const std::wstring& value){
message << value.c_str() << padding;
return *this;
}
通过使用这个特定的重载,我可以在冗长的日志中省去很多麻烦,并且不用太担心是否有第三方std :: strings(例如OSC(char)库与JSON(wchar)库)。
我相对较新于C ++,之前一直生活在Java / JavaScript世界中,我想知道这里是否存在除了潜在的数据丢失之外的风险。是否有平台无关的解决方案?我已经谷歌了几个小时,我想要一个“安全”的解决方案,不会在以后给我带来麻烦。
基本上,我的解决方案似乎可行,但我想知道这样做可能存在的潜在问题。
谢谢!(openframeworks标签只是为了帮助我们解决问题)
编辑:如果有人需要这个OpenFrameworks,下面的内容似乎适合我:
/*
ofLog.h
*/
/// \brief Overload the wstring operator so that this actually works for
/// data of that format
///
ofLog& operator<<(const std::wstring& value){
std::string cvalue;
std::transform(value.begin(), value.end(),
std::back_insert_iterator<std::string>(cvalue),
[](wchar_t wide)
{
return static_cast<char>(wide > 127 ? '?' : wide);
});
message << cvalue << padding;
return *this;
}
/// \brief Overloaded to support wchar_t * types
///
///
ofLog& operator<<(const wchar_t* value)
{
std::wstring wstr(value);
std::string cvalue;
std::transform(wstr.begin(), wstr.end(),
std::back_insert_iterator<std::string>(cvalue),
[](wchar_t wide)
{
return static_cast<char>(wide > 127 ? '?' : wide);
});
message << cvalue << padding;
return *this;
}
//END ofLog.h
wstring
主要由 US-ASCII 内容组成? - Sam Varshavchik