using System.Globalization;
using System.Collections.Generic;
public static void Main() {
string[] diaWords = new string[]
"café", "crème", "naïve",
"Über", "schön", "Grüße", "Müller", "Hölle",
"İstanbul", "Türkiye", "şeker",
"piñata", "jalapeño", "señor"
foreach(string diaWord in diaWords){
Console.WriteLine($"{diaWord} becomes {Normalise(diaWord)}");
static readonly Dictionary<char, string> preEdgeCases = new() {
static readonly Dictionary<char, string> postEdgeCases = new() {
static string Normalise(string input){
StringBuilder builder = new StringBuilder();
foreach (char c in input) {
if (preEdgeCases.TryGetValue(c, out string s)) {
input = builder.ToString();
string normalized = input.Normalize(NormalizationForm.FormD);
foreach (char c in normalized)
if (postEdgeCases.TryGetValue(c, out string s)) {
} else if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) {
return builder.ToString().Normalize(NormalizationForm.FormC);