【问题标题】:Does CString member function CompareNoCase support other language (non-English)?CString 成员函数 CompareNoCase 是否支持其他语言(非英语)?
【发布时间】:2018-03-15 10:17:36
【问题描述】:

我在 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. 是否有函数或库支持非英语(如希腊语、俄语)的大写和小写比较。我想在比较两个字符串时不区分大小写。

【问题讨论】:

  • Thisthis 应该会有所帮助。
  • 实际上,由于 NTFS 区分大小写,您可以在同一目录中创建“αβγ.txt”和“ΑΒΓ.txt”。您必须将FILE_FLAG_POSIX_SEMANTICS 传递给CreateFile 的调用。我不确定,这是一个好主意,或者像 Explorer 这样的文件管理器在遇到名称不同的文件时的行为方式。

标签: c++ string windows mfc compare


【解决方案1】:

您需要做的是设置语言环境。示例:

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 的结果:

MakeUpper 的结果:


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

【讨论】:

  • @zett42 更新了示例以使用CStringWL""。但是用户可能不想要系统语言环境。如果程序以英语运行,但他们想测试希腊文本,他们可能必须具体?
  • @zett42 我也确认了。我已将您的评论纳入答案并调整了我的代码。
  • 虽然这回答了所提出的问题,但它并没有解决 OP 遇到的问题(但从未解释过)。代码需要遵循底层文件系统的排序规则才能可靠地生成文件名的小写或大写版本。我不是该主题的专家,但我相信 NTFS 也支持多种排序规则。
  • 忽略,排序规则和大小写不是一回事。抱歉打扰了。
  • @AndrewTruckle setlocale(LC_CTYPE, "") 可能是显式的?
猜你喜欢
  • 2015-03-27
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多