Похоже, вы хотите убрать диакритические знаки и оставить основной символ. Я бы порекомендовал решение Бен Лингса для этого:
string input = "ŠĐĆŽ šđčćž";
string decomposed = input.Normalize(NormalizationForm.FormD);
char[] filtered = decomposed
.Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
.ToArray();
string newString = new String(filtered);
Изменить: небольшая проблема! Это не работает для Đ. Результат:
SĐCZ sđccz
Джон Скит упомянул следующий код на newsgroup ...
static string RemoveAccents (string input)
{
string normalized = input.Normalize(NormalizationForm.FormKD);
Encoding removal = Encoding.GetEncoding(Encoding.ASCII.CodePage,
new EncoderReplacementFallback(""),
new DecoderReplacementFallback(""));
byte[] bytes = removal.GetBytes(normalized);
return Encoding.ASCII.GetString(bytes);
}
РЕДАКТИРОВАТЬ
Возможно, я сумасшедший, но я просто запустил следующее ...
Dim Input As String = "ŠĐĆŽ-šđčćž"
Dim Builder As New StringBuilder()
For Each Chr As Char In Input
Builder.Append(Chr)
Next
Console.Write(Builder.ToString())
И результат был SDCZ-sdccz
Словарь был бы логическим решением этой проблемы ...
Dictionary<char, char> AccentEquivelants = new Dictionary<char, char>();
AccentEquivelants.Add('Š', 's');
//...add other equivelents
string inputstring = "";
StringBuilder FixedString = new StringBuilder(inputstring);
for (int i = 0; i < FixedString.Length; i++)
if (AccentEquivelants.ContainsKey(FixedString[i]))
FixedString[i] = AccentEquivelants[FixedString[i]];
return FixedString.ToString();
Вам нужно использовать StringBuilder при выполнении подобных операций со строками, потому что строки в C # неизменяемый, поэтому изменение символа за раз приведет к созданию в памяти нескольких строковых объектов, тогда как StringBuilders изменчивы и не имеют этого недостатка.