gpt4 book ai didi

c++ - 将 std::wstring 转换为 cstring 是否安全?

转载 作者:太空狗 更新时间:2023-10-29 21:14:33 24 4
gpt4 key购买 nike

澄清一下,我并不过分担心数据丢失,因为这是为了在我的应用程序中记录操作,并且我使用 wstring 作为主要数据类型.由于我目前使用的框架的性质(默认情况下,OpenFrameworks 日志记录为 std::string,我对此很满意)。

这是我当前转换的示例:

//ofLog.h--patch | `message` is a `std::ostringstream`
ofLog& operator<<(const std::wstring& value){
message << value.c_str() << padding;
return *this;
}

通过使用这个特定的重载,我可以在 Verbose 日志中省去很多烦恼,如果我有第三方 std::strings(例如 OSC(char) 库与 JSON(wchar) 库),我也不必担心太多。

我在 Java/JavaScript 世界中对 C++ 比较陌生,我只是想知道这里除了潜在的数据丢失之外是否还有其他风险。这个问题是否有独立于平台的解决方案?我已经在谷歌上搜索了几个小时,我想要一个“安全”的解决方案,不会让我失望。

基本上我的解决方案似乎有效,但我想知道这样做是否存在潜在问题。

谢谢!(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

最佳答案

显示的代码无法正常工作。 std::wstringc_str()方法返回 const wchar_t * .传递给 std::ostringstreamoperator<<会选择operator<<需要 const void * 的过载参数,它不会完成任何有用的事情。

你说你期待你的 std::wstring主要由 US-ASCII 字符组成。如果是这样,最 hackiest 的方法是粗鲁地转换 std::wstringstd::string , 按照以下方式,将所有非 ASCII 字符替换为问号(或选择您喜欢的标点符号):

std::string cvalue;

std::transform(value.begin(), value.end(),
std::back_insert_iterator<std::string>(cvalue),
[](wchar_t wchar)
{
return static_cast<char>(wchar > 127 ? '?':wchar);
});

继续,<<平凡的std::string进入你的message .

如果您希望您的宽字符串主要由 US-ASCII 内容组成,这将是完成工作的快速 hack。否则,需要使用本地化库以使用当前系统区域设置将宽字符串正确转换为窄字符串。相当多的工作...

关于c++ - 将 std::wstring 转换为 cstring 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40456938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com