&gt; You cannot use them for string-wise operations like substring without explicitly casting or converting them to a string.<p>Why on earth not? Any slice of a string (with a non-pathological internal encoding) with ends on codepoint boundaries is itself a valid string. Losing that information sounds like a whole lot of pointless hassle and potential for harm. It also forces the internal string encoding to be part of the interface, since taking a slice of a string and getting a byte array requires knowing how the string is encoded to use it, but getting another string means that such details are private.<p>It&#x27;s true that they&#x27;re byte offsets, but that doesn&#x27;t matter. The parser doesn&#x27;t care whether it&#x27;s on the 10543th grapheme or the 10597th. It just wants to know where its stuff is.