CString成员函数CompareNoCase是否支持其他语言(非英语)?

时间:2018-03-15 10:17:37

标签: c++ string windows mfc compare

我在Windows中使用vc ++ 2010和MFC,使用Unicode。

以下是我的代码:

CStringW strLowerGreek(L"αβγ");
CStringW strUpperGreek(L"ΑΒΓ");

if (0 == strLowerGreek.CompareNoCase(strUpperGreek))
    AfxMessageBox(_T("Two strings are the same"));
else
    AfxMessageBox(_T("Two strings are different"));

当我运行代码时,弹出消息是“两个字符串不同”。

我想做的是在C盘中创建αβγ.txt,在D盘中创建ΑΒΓ.txt(我不能在同一个盘中创建αβγ.txt和ΑΒΓ.txt) ,我认为αβγ.txt和ΑΒΓ.txt具有相同的名称(不是完整路径,只是文件名),那么我想比较两个文件的内容,并检查它们是否相同。所以我需要一个函数来比较两个文件名称内容区分大小写。

我的问题是:

  1. 根据弹出消息,CString成员函数CompareNoCase不支持希腊小写和大写。那么有什么东西可以在MFC或C ++中完成工作吗?
  2. 是否有函数或库支持非英语(如希腊语,俄语)大写和小写比较。在比较两个字符串时,我想要区分大小写。

1 个答案:

答案 0 :(得分:4)

您需要做的是设置区域设置。例如:

setlocale(LC_ALL, "");
CStringW strLowerGreek(L"αβγ");
CStringW strUpperGreek(L"ΑΒΓ");
int i = strLowerGreek.CompareNoCase(strUpperGreek);
CStringW strText;
strText.Format(L"%s %s %d", strLowerGreek, strUpperGreek, i);
AfxMessageBox(strText);

CStringW strLowerGreek2 = strLowerGreek.MakeUpper();
i = strLowerGreek2.CompareNoCase(strUpperGreek);
strText.Format(L"%s %s %d", strLowerGreek2, strUpperGreek, i);
AfxMessageBox(strText);

我已使用setlocale设置区域设置。最初我将其设置为希腊语("ell")语言环境,但除C语言环境之外的任何语言环境都有效。因此,可以使用更通用的setlocale(LC_ALL,"");来将当前语言环境设置为等于系统语言环境。

当我使用默认语言环境英语)保留时:

  • 返回值为32
  • 文字未转换大写

当我首先将区域设置设置为希腊语

  • 返回值为0
  • 文本已转换大写

CompareNoCase的结果:

Result of CompareNocase

MakeUpper的结果:

Result of MakeUpper

我认为设置区域设置只会影响日期格式化等内容。但它也会影响字符串比较。有关其他信息,请参阅_wcsicmp参考:Call setlocale with any locale other than the C locale before the call to _wcsicmp.

相关问题