为了澄清,我并不过分担心数据丢失,因为这是用于记录我的应用程序中的操作,我使用wstring作为主数据类型。由于我目前使用的框架的性质(OpenFrameworks日志记录默认为std::string
,我很好)。将std :: wstring转换为cstring是否安全?
这里是我的电流转换的例子:
//ofLog.h--patch | `message` is a `std::ostringstream`
ofLog& operator<<(const std::wstring& value){
message << value.c_str() << padding;
return *this;
}
通过使用这种特定的过载,我可以节省自己很多烦恼的详细日志和不用太担心,如果我有第三方的std ::字符串(OSC(char)库vs 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内容组成吗? –
是的,我怀疑它几乎总是ASCII为关键信息 –
为std :: wstring :: c_str(),它返回常量wchar_t *;但是,std :: ostringstream没有运算符<<重载取const const wchar_t *作为论点;它可能选择operator <<(void *),这可能不是你想要的。 –