Как изменить диакритических знаков, чтобы не диакритические те [дубликат]
этот вопрос уже есть ответ здесь:
Я нашел ответ, Как удалить диакритические символы в stackoverflow, но не могли бы вы сказать мне, можно ли изменить диакритические символы на недиакритические одни?
5 ответов
копирование мой собственный ответ на другой вопрос:
вместо того, чтобы создавать свою собственную таблицу, вы можете вместо этого преобразовать текст в форму нормализации D, где символы представлены как базовый символ плюс диакритика (например, "á" будет заменен на "a" с последующим сочетанием острого акцента). Затем вы можете удалить все, что не является буквой ASCII.
таблицы все еще существуют, но теперь они из стандарт Unicode.
вы также можете попробовать NFKD вместо NFD, чтобы поймать еще больше случаев.
ссылки:
поскольку никто никогда не потрудился опубликовать код для этого, вот он:
// \p{Mn} or \p{Non_Spacing_Mark}:
// a character intended to be combined with another
// character without taking up extra space
// (e.g. accents, umlauts, etc.).
private readonly static Regex nonSpacingMarkRegex =
new Regex(@"\p{Mn}", RegexOptions.Compiled);
public static string RemoveDiacritics(string text)
{
if (text == null)
return string.Empty;
var normalizedText =
text.Normalize(NormalizationForm.FormD);
return nonSpacingMarkRegex.Replace(normalizedText, string.Empty);
}
Примечание: большая причина для необходимости сделать это, когда вы интегрируетесь в стороннюю систему, которая делает только ascii, но ваши данные находятся в unicode. Это обычное дело. Ваши варианты в основном: удалить акцентированные символы или попытаться удалить акценты из акцентированных символов, чтобы попытаться сохранить как можно больше исходного ввода. Очевидно, что это не идеальное решение, но это на 80% лучше, чем просто удалить любой символ выше ascii 127.
возможно, также стоит отступить и рассмотреть почему вы хотите сделать это. Если вы пытаетесь удалить различия символов, которые вы считаете незначительными, вы должны посмотреть алгоритм сортировки Unicode. Это стандартный способ игнорировать различия, такие как регистр или диакритика при сравнении строк для поиска или сортировки.
Если вы планируете отобразить измененный текст, рассмотрите свою аудиторию. То, что вы можете безопасно отфильтровать, зависит от локали. В американском английском "Igloo" = " igloo "и" resume " = "résumé", но в турецком, нижний регистр I является I (dotless), а во французском, кот означает цитату, кот означает сторону, и кот означает побережье. Таким образом, язык сортировки определяет, какие различия являются значимыми.
Если удаление диакритики является правильным решением для вашего приложения, безопаснее всего создать свою собственную таблицу, в которую вы явно добавляете символы, которые хотите преобразовать.
общий, автоматизированный подход может быть разработано с использованием декомпозиции Unicode. При этом вы можете разложить символ с диакритикой на" комбинирующие " символы (диакритические метки) и базовый символ, с которым они объединены. Отфильтровать любую вещь, которая представляет собой сочетание символов, и вы должны иметь "не-Знака" те.
отсутствие дискриминации в автоматизированном методе, однако, может иметь некоторые неожиданные последствия. Я бы рекомендовал провести большое тестирование репрезентативного текста.
простой пример:
чтобы удалить диакритики из строки:
string newString = myDiacriticsString.Normalize(NormalizationForm.FormD);
мой сайт входные данные из внешних источников, которые имеют много странных персонажей. Я написал следующую функцию C# для замены акцентированных символов и удаления символов клавиатуры, отличных от US, с помощью Regex:
using System.Text;
using System.Text.RegularExpressions;
internal static string SanitizeString(string source)
{
return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""!@#$%\^&\*\(\)-_=\+;:<>\/\\|\}\{\[\]`~]*", string.Empty).Trim();
}
надеюсь, что это помогает.