Two visually identical strings fail an equality check.
Almost certainly composed versus decomposed forms: "é" as one code point or as "e" plus a combining accent. Normalise both sides with NFC before comparing, and store normalised so the problem does not come back through a different door.
Alphabetical sort puts accented names at the end.
Byte order is not alphabetical order. Use a locale-aware collator, and pick the locale deliberately, because Swedish and German disagree about where "ä" belongs and both are right for their readers.
len() disagrees with what users see as one character.
Because a user-perceived character can be several code points: an emoji with a skin tone modifier is one grapheme and up to four code points. Count grapheme clusters when the number is shown to a person, code points when it is a storage limit.