normaliseAccents method
Removes accents and special diacritical marks, converting to basic Latin.
Handles common European accented characters (é, ñ, ü, etc.) and returns their unaccented equivalents while preserving case. Also converts ligatures and special characters (ß, æ, etc.) to their ASCII equivalents.
Example:
'café'.normaliseAccents() // 'cafe'
'niño'.normaliseAccents() // 'nino'
'Søren'.normaliseAccents() // 'Soren'
'naïve'.normaliseAccents() // 'naive'
Implementation
String normaliseAccents() {
// Define accent mappings: (regex pattern) -> (lowercase, uppercase)
final accentMaps = [
(RegExp(r'[àáâãäåÀÁÂÃÄÅ]'), 'a', 'A'),
(RegExp(r'[èéêëÈÉÊË]'), 'e', 'E'),
(RegExp(r'[ìíîïÌÍÎÏ]'), 'i', 'I'),
(RegExp(r'[òóôõöøÒÓÔÕÖØ]'), 'o', 'O'),
(RegExp(r'[ùúûüÙÚÛÜ]'), 'u', 'U'),
(RegExp(r'[ýÿÝŸ]'), 'y', 'Y'),
(RegExp(r'[çÇ]'), 'c', 'C'),
(RegExp(r'[ñÑ]'), 'n', 'N'),
(RegExp(r'[đĐ]'), 'd', 'D'),
(RegExp(r'[ðÐ]'), 'd', 'D'),
(RegExp(r'[þÞ]'), 'th', 'TH'),
(RegExp(r'[ßẞ]'), 'SS', 'ss'),
(RegExp(r'[æÆ]'), 'ae', 'AE'),
(RegExp(r'[œŒ]'), 'oe', 'OE'),
];
var result = this;
for (var (pattern, lower, upper) in accentMaps) {
result = result.replaceAllMapped(pattern, (match) {
final char = match.group(0)!;
return char == char.toUpperCase() ? upper : lower;
});
}
return result;
}