Ответ для , почему не работает, состоит в том, что утверждение, что "d является его базовым символом", является ложным. U + 0111 (LATIN SMALL LETTER D WITH STROKE) имеет Unicode-категорию «Буквы, строчные буквы» и не имеет сопоставления декомпозиции (то есть не разлагается на «d», за которым следует знак объединения).
"đ".Normalize(NormalizationForm.FormD)
просто возвращает "đ"
, который не удаляется циклом, потому что это не пробел.
Аналогичная проблема будет существовать для "ø" и других букв, для которых Unicode не обеспечивает отображение декомпозиции. (И если вы пытаетесь найти «лучший» символ ASCII для представления буквы Unicode, этот подход не будет работать вообще для кириллицы, греческого, китайского или других нелатинских алфавитов; вы также столкнетесь с проблемами, если вы хотели транслитерировать, например, «ß» в «ss». Использование библиотеки типа UnidecodeSharp может помочь.)