Здравствуйте.
У меня есть задача сравнить строки на не-.NET языке в точности подобно тому, как это делается на .NET.
Например, функция String.Equals. Если у нас не Ordinal сравнение, то учитывается культура, а также, проводится нормализация перед сравнением. Правильно? Или неправильно? Влияет ли культура на результат сравнения? Если проводится нормализация, то по какой форме?
Здравствуйте, Went, Вы писали:
W>Например, функция String.Equals. Если у нас не Ordinal сравнение, то учитывается культура, а также, проводится нормализация перед сравнением. Правильно? Или неправильно? Влияет ли культура на результат сравнения? Если проводится нормализация, то по какой форме?
https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/String.Comparison.cs... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Здравствуйте, Went, Вы писали:
НС>>https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/String.Comparison.cs
W>Огромное спасибо, то что надо!
Только там тебе смотреть не чего. Точнее разве что вот на это:
public static int Compare(string? strA, string? strB, CultureInfo? culture, CompareOptions options)
{
CultureInfo compareCulture = culture ?? CultureInfo.CurrentCulture;
return compareCulture.CompareInfo.Compare(strA, strB, options);
}
Так что тебе нужно на
CompareInfo смотреть, если хочешь именно в соответствии с правилами для культур сравнивать. А там дальше по коду:
// Compare a string using the native API calls -- COMNlsInfo::InternalCompareString
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.Process)]
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
[SuppressUnmanagedCodeSecurity]
private static extern int InternalCompareString(IntPtr handle, IntPtr handleOrigin, String localeName, String string1, int offset1, int length1,
String string2, int offset2, int length2, int flags);
Т.е. всё уходит в нэйтив.
Тут скорее вопрос, а зачем тебе это надо? Может проще позвать дотнетную функцию из неуправляемого приложения?