vag*_*nka 6 c++ string unicode winapi
我正在尝试比较一些相似的字符串,例如:
字符串的比较"H2O??????"和"?2???????"应返回true
字符串的比较"?????????"和"?2???????"应返回true
我将按TCHAR数组获取这些字符串。有什么方法可以比较这些类型的字符串吗?
我尝试通过逐个字符进行比较,但是它不起作用。
#define MAX_STRING 256
bool IsStringsEqual(TCHAR* str1, TCHAR* str2)
{
if (_tcscmp(str1, str2) == 0)
return true;
else
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR original [MAX_STRING];
ZeroMemory(original, sizeof(TCHAR) * MAX_STRING);
_stprintf_s(original, TEXT("%s"), _T("?2????????"));
TCHAR str1[MAX_STRING];
ZeroMemory(str1, sizeof(TCHAR) * MAX_STRING);
_stprintf_s(str1, TEXT("%s"), _T("H2O???????"));
if (IsStringsEqual(original,str1))
wcout << endl << " Equal";
TCHAR str2[MAX_STRING];
ZeroMemory(str2, sizeof(TCHAR) * MAX_STRING);
_stprintf_s(str2, TEXT("%s"), _T("?2????????"));
if (IsStringsEqual(original, str2))
wcout << endl << " Equal";
TCHAR str3[MAX_STRING];
ZeroMemory(str3, sizeof(TCHAR) * MAX_STRING);
_stprintf_s(str3, TEXT("%s"), _T("??????????"));
if (IsStringsEqual(original, str3))
wcout <<endl<< " Equal";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望它在上述所有比较中都能显示Equal。
看起来您正在寻找的是Unicode Compatibility normalized forms。您可以通过NormalizeString在比较之前使用来实现它(代码不处理错误和不适合的字符串):
bool IsStringsEqual(wchar_t* str1, wchar_t* str2)
{
wchar_t buf1[MAX_STRING], buf2[MAX_STRING];
NormalizeString(NormalizationKD, str1, -1, buf1, MAX_STRING);
NormalizeString(NormalizationKD, str2, -1, buf2, MAX_STRING);
return wcscmp(buf1, buf2) == 0;
}
Run Code Online (Sandbox Code Playgroud)