Вам стоит посмотреть ответ от на этот вопрос .
Включает следующий метод (из записи в блоге Майкла Каплана " Разборка - интересная работа "):
static string RemoveDiacritics(string stIn) {
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for(int ich = 0; ich < stFormD.Length; ich++) {
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if(uc != UnicodeCategory.NonSpacingMark) {
sb.Append(stFormD[ich]);
}
}
return(sb.ToString().Normalize(NormalizationForm.FormC));
}
Это удалит все символы NonSpacingMark из строки. Это означает, что он преобразует é
в e
, потому что é
фактически построен из символов e
и ´
.
´
- это «NonSpacingMark», что означает, что он будет добавлен к предыдущему символу. Метод пытается обнаружить эти специальные символы и перестраивает строку без символов NonSpacingMark. (Вот как я понимаю, это может быть не так).
Это не будет работать для всех символов Юникода, но ввод от пользователей, использующих набор символов латинского алфавита (английский, испанский, французский, немецкий и т. Д.), Будет "очищен" У меня нет опыта работы с азиатскими наборами символов.
После обратной связи
Я приспособил рутину к информации, которую получил из комментариев и ответов на этот вопрос. Моя текущая версия:
public static string RemoveDiacritics(string stIn) {
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++) {
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
switch (uc) {
case UnicodeCategory.NonSpacingMark:
break;
case UnicodeCategory.DecimalDigitNumber:
sb.Append(CharUnicodeInfo.GetDigitValue(stFormD[ich]).ToString());
break;
default:
sb.Append(stFormD[ich]);
break;
}
}
return (sb
.ToString()
.Normalize(NormalizationForm.FormKC));
}
Эта маршрутизация удалит диакритические знаки (насколько это возможно) и преобразует другие "странные" символы в их "нормальную" форму.