safeReverse method

String safeReverse()

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('');
}