如果您使用正确的编码,字符串可以保存任何数据。它们只是字节序列。但是您需要检查您的特定编码/转换例程。
应该只是一个往返的问题。许多事情的优雅解决方案。
警告,伪代码,没有文字 convert_to_wstring() 除非你这样做:
if(convert_to_wstring(convert_to_string(ws)) == ws)
happy_days();
如果输入的内容出来了,它是无损的(至少对于您的代码点而言)。
这不是最有效的解决方案,但应该允许您从自己喜欢的转换例程构建。
// Round-trip and see if we lose anything
bool check_ws2s(const std::wstring& wstr)
{
return (s2ws(ws2s(str)) == wstr);
}
在How to convert wstring into string? 使用@dk123 对C++11 的转换(在https://stackoverflow.com/a/18374698/257090 上投票他的答案)
wstring s2ws(const std::string& str)
{
typedef std::codecvt_utf8<wchar_t> convert_typeX;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.from_bytes(str);
}
string ws2s(const std::wstring& wstr)
{
typedef std::codecvt_utf8<wchar_t> convert_typeX;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.to_bytes(wstr);
}
注意,如果您的转换想法是将宽字符截断为字符,那么只需迭代并检查每个宽字符值是否适合一个字符。这可能会做到。
警告:不适合多字节编码。
for(wchar_t& wc: ws) {
if(wc > static_cast<char>::(wc))
return false;
}
return true;
或者:
// Could use a narrowing cast comparison, but this avoids any warnings
for(wchar_t& wc: ws) {
if(wc > std::numeric_limits<char>::max())
return false;
}
return true;
FWIW,在 Win32 中,有一些转换例程接受 WC_ERR_INVALID_CHARS 的参数,该参数告诉例程失败,而不是静默删除代码点。当然是非标准解决方案。
示例:WideCharToMultiByte()
http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx