Utf-32 is only fixed length if you don't care about diacritics, variation selectors, RTL languages, and others. Unicode is not one code point or one char/wchar/uint32 per glyph.
You've changed topic from code points to grapheme clusters. Rust's character/string support is strictly for code points (the documentation is fairly clear about the distinction).
Few string libraries actually deal with grapheme clusters as the native underlying representation (Swift being a notable exception).
The broader point I'm making is that unicode is hard and attempts to simplify it by choosing a different encoding (i.e. switching to utf-32 to save yourself from all problems) are a bit misguided.
Few string libraries actually deal with grapheme clusters as the native underlying representation (Swift being a notable exception).