Складной футляр для ускорения сравнения
"strasse".Equals("STRAße",StringComparison.InvariantCultureIgnoreCase)
Это возвращает истину. Что правильно. К сожалению, когда я сохраняю один из них в postgres, он думает, что они не совпадают при выполнении нечувствительного к регистру соответствия (например, с ~*
). Я также проверил с Citext.
Таким образом, одним из решений было бы предварительно сложить дело, таким образом сохраняя strasse
для любого из этих значений в другом столбце. Я мог бы затем индексировать и искать по ним совпадения.
Я искал, как сложить регистр в C#, и так и не смог найти решение в C#. Очевидно, что знания есть, потому что они могут правильно сравнивать эти строки, я просто не могу найти, где их получить.
Одним из решений будет порождать процесс Perl perl -E "binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while (<>) { print fc }"
установите сторону C# процесса для utf8 и для этих каналов, и просто отправьте текст через perl, чтобы сложить регистр. Но должен быть лучший способ, чем это.
2 ответа
Есть
string.Normalize()
, который занимает
NormalizationForm
параметр. Майкл Каплан подробно рассказывает об этом. Он утверждает, что работает лучше, чем
FoldStringW
.
Однако он не нормализует регистр к верхнему или нижнему, а только сворачивает к канонической форме. Я бы посоветовал вам просто подать заявку
ToUpper
или же
ToLower
после.
Просматривая исходники, я в конце концов обнаружил, что большая часть этой реализации находится в наборе классов с именем CompareInfo.
Вы можете найти их на github.com/dotnet/runtime.
Это привело меня на эту страницу, которая дает представление о внутренней работе .net-культуры. Глобализация .NET и ICU
Похоже, что dotnet на самом деле полностью полагается на родные библиотеки во всем, кроме порядковых операций.
Я бы предположил, что .Net Framework, вероятно, использует NLS из Win32. Для этого есть многообещающий метод FoldStringW .
Для ICU есть документация по Case Mappings , и я нашел метод u_strFoldCase .