Как заменить специальные символы их эквивалентами (например, á для a) в C #?

Мне нужно получить текстовое содержимое на португальском языке из файла Excel и создать xml, который будет использоваться приложением, не поддерживающим такие символы, как «ç», «á», «é» и другие. И я не могу просто удалить символы, а заменить их эквивалентами (например, «c», «a», «e»).

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


person jehuty    schedule 06.03.2010    source источник
comment
ç и c не эквивалентны.   -  person Mark Byers    schedule 06.03.2010
comment
они для человеческого чтения без символов!   -  person jehuty    schedule 06.03.2010


Ответы (4)


Вы можете попробовать что-то вроде

var decomposed = "áéö".Normalize(NormalizationForm.FormD);
var filtered = decomposed.Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark);
var newString = new String(filtered.ToArray());

Это расставляет акценты в тексте, фильтрует их и создает новую строку. Комбинированные диакритические знаки относятся к категории Unicode без пробелов.

person Ben Lings    schedule 06.03.2010
comment
Привет, Бен, спасибо за фрагмент, но он плохо обрабатывает символы Ł и ł (сохраните их как оригинальные, вместо этого измените на L и l). - person binball; 06.02.2012
comment
Он также ничего не делает с æ. - person AgentFire; 13.06.2019

На будущее, это именно то, что у меня получилось:

temp = stringToConvert.Normalize(NormalizationForm.FormD);
            IEnumerable<char> filtered = temp;
            filtered = filtered.Where(c => char.GetUnicodeCategory(c) != System.Globalization.UnicodeCategory.NonSpacingMark);
            final = new string(filtered.ToArray());
person jehuty    schedule 09.03.2010

Работа лучше с этим решением:

string test = "áéíóúç";

string result = Regex.Replace(test .Normalize(NormalizationForm.FormD), "[^A-Za-z| ]", string.empty);
person user2588273    schedule 07.03.2014

person    schedule
comment
Хотя это самое простое решение (возможно, не самое элегантное), оно делает именно то, что вам нужно. Было бы лучше, если бы вы создали многоразовую функцию (со статическим списком замен). Одним из недостатков этого подхода является то, что вам необходимо знать ВСЕ возможные символы, которые вы хотите заменить, и добавлять в список символы верхнего и нижнего регистра (что может потребовать некоторых проб и ошибок). Также вы, вероятно, сделаете ошибки при копировании операторов добавления для создания новых элементов (например, забудете заменить одну из строк), что может вызвать путаницу при возникновении ошибок. - person Gertjan; 09.03.2010