Hugo, tava revisando o que eu sabia sobre Unicode nestes últimos dias e voltei mais uma vez nesta sua publicação, que está incrivelmente boa e cheia de referências.

Acontece que dessa vez notei 2 pontos que eu acho que estão imprecisos. Vou apresentar meu ponto de vista e vc me diz o que acha, beleza?

Primeiro, sobre esta parte:

... e neste encoding os emojis usam mais de 1 byte ...

Esta afirmação não faz sentido porque, seja em UTF-16 ou UCS-2, todos os caracteres usam mais de 1 byte já que cada code unit tem exatamente 2 bytes.

E o segundo é sobre esta parte aqui:

Enfim, isso explica porque em Python o tamanho da string é 13 e em JavaScript é 16. Um considera a quantidade de code points, o outro guarda a string internamente em UTF-16 e considera a quantidade de bytes resultantes. E um caractere pode ser formado por mais de um code point.

Como vc bem explicou, code points acima do BMP são codificados usando um par de surrogates code points.

E como eu disse acima, todo caracter em UTF-16 ocupa, pelo menos, 2 bytes.

Sendo assim, pelo que observei, JavaScript não considera a quantidade de bytes, mas sim de code units.

Sobre isso a especificação no diz o seguinte:

The String type is the set of all ordered sequences of zero or more 16-bit unsigned integer values (“elements”) up to a maximum length of 253 - 1 elements.

E:

...in which case each element in the String is treated as a UTF-16 code unit value.

Fonte: https://262.ecma-international.org/14.0/#sec-ecmascript-language-types-string-type

E são esses meu pontos. Obrigado por compartilhar conhecimento!

Realmente, o correto nesses trechos seria code units e não bytes.

Já corrigi o texto, obrigado!