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!