2015-11-04 73 views
1

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

我知道我可以改变.NET端使用序号排序,但这可能会打破一些外语排序。我想要的是改变MFC排序,以便按照“文化特定”的方式进行排序,如.NET方面。我在Win32 API中发现了CompareStringEx,但是想知道是否有一个MFC解决方案或者我缺少的其他东西。

在此先感谢。

+0

明显的问题:你用什么C++排序? std :: sort(或更好的std :: stable_sort)也接受一个比较函数对象。你可以使用语言环境感知_wcsicmp编写自己的_wcsicmp –

+0

我正在使用CString操作符<(它使用_mbscmp') – edtheprogrammerguy

+0

然后不要使用它并使用区域设置感知比较函数! –

回答

1

针对特定于语言环境的比较,MFC的CString类具有CollateCollateNoCase。我没有测试过它们以确保它们符合.NET的排序顺序,但我希望都使用相同的Win32函数,在这种情况下,它们显然是匹配的。

+0

感谢您的输入,但Collat​​e按照与上面给出的示例相同的顺序进行排序。 – edtheprogrammerguy

+1

@edtheprogrammerguy:猜测,你可能还没有告诉C++你想使用的语言环境。默认情况下,它将使用“C”语言环境,它基本上不是本地化的。我的直接反应是在程序启动后立即尝试类似'setlocale(LC_COLLATE,“”);'或指定一个区域名称,而不是像空字符串指定的那样只使用用户的默认区域设置。 –

+0

好的答案 - 我实际上可以通过使用'_stricoll_l'和使用'_create_locale(LC_COLLATE,“”);''创建的语言环境“使用您建议的参数来使它与类似的东西一样工作, 。谢谢! – edtheprogrammerguy