【问题标题】:Sorting strings in MFC vs. C#在 MFC 与 C# 中对字符串进行排序
【发布时间】:2016-02-05 06:03:50
【问题描述】:

我有一个同时使用 C# 和本机 C++ (MFC) 的旧版应用程序。我需要对两边的字符串进行排序,以使它们的顺序相同。问题是在使用string.Compare 的.NET 端,它以“特定于文化”的方式出现,例如,“A_B”在“A11”之前排序,而在 MFC 中,使用operator <,“A11”排在“A_B”之前。

我知道我可以将 .NET 端更改为使用序数排序,但这可能会破坏一些外语排序。我想要的是更改 MFC 排序,使其以“特定于文化”的方式进行排序,就像 .NET 端一样。我在 Win32 API 中找到了CompareStringEx,但我想知道是否有 MFC 解决方案或我缺少的其他东西。

提前致谢。

【问题讨论】:

  • 显而易见的问题:您使用什么进行 C++ 排序? std::sort(或更好的 std::stable_sort)也接受比较函数对象。您可以使用 locale-aware _wcsicmp 编写自己的
  • 我正在使用 CString 运算符_mbscmp)
  • 那就不要使用它,并使用区域感知比较功能!
  • @AdrianoRepetti - 这就是我正在寻找的 - 一个与 .NET 端匹配的比较函数。谢谢!

标签: c# c++ .net sorting mfc


【解决方案1】:

MFC 的 CString 类具有 CollateCollateNoCase 用于特定于区域设置的比较。我没有对它们进行测试以确保它们匹配 .NET 排序顺序,但我预计两者都使用相同的 Win32 函数,在这种情况下它们显然会匹配。

【讨论】:

  • 感谢您的输入,但整理排序的顺序与< 与我上面给出的示例相同。
  • @edtheprogrammerguy:猜测一下,您可能还没有告诉 C++ 您要使用的语言环境。默认情况下,它将使用“C”语言环境,基本上根本没有本地化。我的直接反应是在程序启动后立即尝试setlocale(LC_COLLATE, ""); 之类的东西(或指定一个区域设置名称,而不是像空字符串指定的那样仅使用用户的默认区域设置)。
  • 好答案 - 我实际上能够通过使用 _stricoll_l 和使用您建议的参数创建的区域设置 _create_locale(LC_COLLATE, ""); 使其与类似的东西一起工作,并且对整个程序的干扰更少.谢谢!
  • CollatestrcollCompareStringEx 不同。例如,您需要 CompareStringEx 在资源管理器中复制排序顺序。 CompareStringEx 在 ANSI 中也不可用。
猜你喜欢
  • 2013-11-21
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多