I&#x27;m getting tired of this argument, we had it in the Rust community as well and I was tired of it there, too.  I&#x27;ve seen the same argument over and over again, and every argument had the same hole that I see in your post: What, <i>exactly</i>, is a &quot;character&quot;?  Please answer me that, and then you can write a proposal for how the API should work, <i>exactly</i>, and why this works with Indic and German and Korean and everything else.<p>Strings have to be arrays.  It is inevitable.  We are on Von Neumann machines with L1 cache lines that are something like 64 bytes wide, so making strings into something other than arrays is a complete non-starter.  Because strings are arrays, we use array indexes to slice strings.  The indexes are integers, because that just makes sense on a Von Neumann machine.<p>So your complaint is that you can slice a string in &quot;bad&quot; ways.  What makes it bad?  You&#x27;re trying to prevent people from slicing up grapheme clusters, which is a noble goal.  But in practice, we get the indexes from methods like str.find() or re.match(), and we treat them as more or less opaque, so we don&#x27;t end up slicing grapheme clusters very often in practice.  Grapheme cluster slicing requires a big Unicode table in memory anyway, so in the rare case that you need it, you can pay the high performance cost for using it.  In the meantime, formats like JSON and XML are defined in terms of code points, so using code point arrays eliminates a class of bugs where you could accidentally make malformed XML or JSON, which would then get completely REJECTED by the receiving side, causing your Jabber client to quit or your web browser to show a bunch of mojibake.<p>And let me ask you this: what do I get when I write:<p><pre><code>    x = &quot;a&quot;
    y = &quot;\u0301&quot;
</code></pre>
Is the resulting len(x + y) == 1?  But len(x) == 1 and len(y) == 1?  Can you tell me what the correct behavior is?  Might you end up with bugs in programs because len(x + y) != len(x) + len(y)?  Or do you introduce extra code points into the string when you concatenate them?<p>Please, tell me what you actually think is correct behavior.  It is far, far more useful than pointing out that something is &quot;wrong&quot; on purely semantic arguments.