I gave this a quick look at 2X speed with a lot fast seeking, and my brain still hurts.
First of all, and concerning Rust, please familiarize yourself with the mem module and its functions at least. You didn't even get near a situation where using unsafe{} was actually required.
Second of all, and concerning the task at hand itself, for someone who knew to make the distinction between bytes and chars, you should have known about grapheme clusters too. There are a lot of multi-char (not just multi-byte) graphemes out there. You can make a "Fun With Flags" 😉 segment to show that off (no attribution required). Just don't do anything silly, and make sure to just utilize the unicode-segmentation crate.