Строковые диакритические знаки замены в C# [дубликат]

5
задан Community 23 May 2017 в 12:16
поделиться

3 ответа

Похоже, вы хотите убрать диакритические знаки и оставить основной символ. Я бы порекомендовал решение Бен Лингса для этого:

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
13
ответ дан 18 December 2019 в 06:02
поделиться

Джон Скит упомянул следующий код на 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

14
ответ дан 18 December 2019 в 06:02
поделиться

Словарь был бы логическим решением этой проблемы ...

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 изменчивы и не имеют этого недостатка.

0
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: