I think this is bit too strongly worded - It’s Not Wrong that "🤦🏼♂️".length == 7. There are multiple levels of interpreting a string's contents.
Originally, String didn't even conform to Collection (so it didn't have a .count member), and instead had a .characters view. That was considered too cumbersome and so characters was made the "default" view. Other languages might decide to use a different default view, but I wouldn't say that they "got it wrong" for deciding differently from Swift in that respect.
But on the broader point, you are correct. Unicode is difficult, it has evolved over time and gained additional complexity, and developers and programming languages in general have struggled to manage that. In my opinion, Swift has done an excellent job at presenting an API which effectively manages that inherent complexity.
Many (most?) things in programming look simple on the surface but have a surprising amount of complexity once you look deeper. Strings are one such example. Floating-point numbers are another. For all of the complaints about the hidden complexities of strings, you could direct very similar complaints at floats:
print(0.1 + 0.1 + 0.1)
// 0.30000000000000004
// developer: "floats are flat-out unpleasant to use"
Software engineering is all about this kind of thing - you don't just hand-wavingly tell a computer what to do and it does it; you have a set of tools, they have different characteristics, and you have to understand what their relative strengths are and when to use (or not use) each tool.
If you're not prepared to do that, to gain that understanding and appreciate those differences, you're going to find software engineering a struggle. Regardless of which language you use.



