safeReverse method
Reverses the string while preserving grapheme clusters (emoji-safe).
Unlike reverse, this handles multi-byte characters correctly, so emoji flags and other combined characters don't get split apart.
Example:
'👨👩👧👦hello'.safeReverse() // 'olleh👨👩👧👦' (emoji intact)
'café'.safeReverse() // 'éfac' (accent preserved)
Implementation
String safeReverse() {
final graphemes = characters.toList();
final reversed = graphemes.reversed.toList();
final result = <String>[];
for (var grapheme in reversed) {
if (grapheme.endsWith('\u200D')) { // Ends with ZWJ
// Extract ZWJ and the base character
final zwj = '\u200D';
final base = grapheme.substring(0, grapheme.length - 1);
result.add(zwj + base);
} else {
result.add(grapheme);
}
}
return result.join('');
}