2015-11-04 115 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