我有什么:
我只是想比较这两个值 - 但以下代码似乎不起作用。 KMP。
这是从char *到std :: wstring,
的转换器std::wstring TimeZone::TimeZone::char2ws(const char* src)
{
/* Convert to a wchar_t*
* http://msdn.microsoft.com/en-us/library/ms235631(v=vs.80).aspx
*/
// Convert to a wchar_t*
size_t origsize = strlen(src) + 1;
const size_t newsize = 512;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, src, _TRUNCATE);
return wcstring;
}
之后我与
进行了简单的比较// wstr1 is std::wstring, with "(GMT+04:30) Kabul" string
// wstr2 = char2ws(str2),
return (wstr1 == wstr2);
没有运气。 VSVC2008 IDE调试器中的字符串在视觉上是相同的。
问题:为什么比较方法总是给我 false ?
感谢。
解决方案:非常感谢Alexandre C.
bool weirdEquals(const std::wstring& str, char const* c)
{
std::string c_str(c);
if (str.size() < c_str.size())
{
return false;
}
return std::equal(c_str.begin(), c_str.end(), str.begin());
}
PS。我做了一些改变。
答案 0 :(得分:1)
要比较字符串,您需要通过相同的字符集进行比较。 wchar_t
和char
明显使用不同的字符集,因此您无法使用典型的char-for-char字符串比较来比较它们。
通常,您会将char*
字符串转换为wchar_t*
字符串(使用mbtowcs
或MultiByteToWideChar
),以便您可以将它们作为Unicode字符串进行比较,因为您做。
但我怀疑在你的情况下,你只希望简单的ASCII字符匹配,在这种情况下,你可以进行char-by-char比较,将wchar_t
s与char
进行比较。注意:不使用强制转换来执行此操作。
至于您的转换无效的原因,请参阅@ Erik的回答。
答案 1 :(得分:1)
比较如下,如果您确定只有ASCII字符。
否则,您可以将自定义(依赖于语言环境的?)比较器传递给std::equal
。
bool weirdEquals(char const* c, size_t n, const std::wstring& str)
{
if (str.size() < n) return false;
return std::equal(c, c + n, str.begin());
}
答案 2 :(得分:0)
您需要将newsize
而不是origsize
传递给mbstowcs_s。
另外,请考虑使用:
wchar_t wcstring[newsize] = { 0 };