Also, it&#x27;s incompatible with UTF-8 strings stored in C, which means that when you cross the Python&#x2F;C API boundary, you have to re-encode all strings.  This is a large performance penalty right at the time when you can least afford performance penalties.<p>IMNSHO, most modern languages should be storing strings as UTF-8 and give up on random access by characters.  You almost never need it; in the most frequent case where you do (using indexOf or equivalent to search for a substring, and then breaking on it), you can solve the problem by returning a type-safe iterator or index object that contains a byte offset under the hood, and then slicing on that.  Go, Rust, and Swift have all gone this route.