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

C++ CString成员函数CompareNoCase是否支持其他语言(非英语)?,c++,string,windows,mfc,compare,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 str

我在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有相同的名称(不是完整路径,只是文件名),然后我想比较两个文件的内容,然后检查它们是否相同。所以我需要一个函数来比较两个文件名,区分大小写

我的问题是:

  • 根据弹出消息,
    CString
    member function
    CompareNoCase
    不支持希腊文小写和大写。那么,有什么东西可以在MFC或C++中工作?
  • 是否有函数或库支持非英语(如希腊语、俄语)的大小写比较。我想在比较两个字符串时考虑大小写敏感度

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

    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);
    
    我已使用设置区域设置。最初我将其设置为希腊语(
    “ell”
    )语言环境,但C语言环境以外的任何语言环境都可以工作。因此,更通用的
    setlocale(LC_ALL,”)可用于将当前语言环境设置为系统语言环境

    当我将其保留为默认区域设置时(即英语):

    • 返回值为
      32
    • 文本未转换为大写
    当我首先将区域设置设置为希腊语时:

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

    比较案例的结果

    MakeUpper的结果



    我认为设置区域设置只会影响日期格式之类的事情。但它也会影响字符串比较。请参阅
    \u wcsicmp
    参考:了解更多信息。

    并且应该会有所帮助。实际上,由于NTFS区分大小写,您可以在同一目录中创建“αβγ.txt”和“αβγ.txt”。您必须将
    FILE\u FLAG\u POSIX\u SEMANTICS
    传递给调用。我不确定这是否是个好主意,也不确定像Explorer这样的文件管理器在遇到名称仅大小写不同的文件时的行为。@zett42更新了示例,使用
    CStringW
    L”“
    。但是用户可能不需要系统区域设置。“如果程序是用英语运行的,但他们想测试希腊语文本,那么他们可能必须是具体的?”zett42在我结束时也证实了这一点。我已经将你的评论加入到答案中,并调整了我的代码。虽然这回答了被问到的问题,但并不能解决OP遇到的问题(但从未解释过)。代码需要遵循底层文件系统的排序规则,才能可靠地生成文件名的小写或大写版本。我不是这方面的专家,但我相信NTFS也支持多种排序规则。忽略这一点,排序规则和大小写不是一回事。抱歉,这里有噪音。@andretruckle setlocale(LC_CTYPE,“”)可能是显式的吗?