Tenho Ruby 3.3.4 instalado no MacOS 14.6.1.
Suponha que eu tenha esta string no shell:
$ st="0😀2☺️4🤪6🥳8🥸"
$ echo "$st"
0😀2☺️4🤪6🥳8🥸
Se eu inserir essa string no Ruby, o segundo emoji será dividido em partes constituintes:
$ echo "$st" | ruby -lne 'p $_.split("")'
["0", "😀", "2", "☺", "️", "4", "🤪", "6", "🥳", "8", "🥸"]
^ ^ # should be ONE grapheme
O mesmo se eu ler essa string de um arquivo:
$ cat wee_file
0😀2☺️4🤪6🥳8🥸
$ ruby -lne 'p $_.split("")' wee_file
["0", "😀", "2", "☺", "️", "4", "🤪", "6", "🥳", "8", "🥸"]
A mesma coisa no IRB:
irb(main):001> File.open('/tmp/wee_file').gets.split("")
=> ["0", "😀", "2", "☺", "️", "4", "🤪", "6", "🥳", "8", "🥸", "\n"]
Mas se eu substituir ☺️ por outro emoji (que também é multibyte), o problema desaparece:
$ st2="0😀2🐱4🤪6🥳8🥸"
$ echo "$st2" | ruby -lne 'p $_.split("")'
["0", "😀", "2", "🐱", "4", "🤪", "6", "🥳", "8", "🥸"]
# also from a file and also in IRB..
Alguma ideia de por que o emoji ☺️ está produzindo esse resultado?
É porque ☺️ é composto por dois personagens:
☺
U+263A (Rosto Branco Sorridente)◌️
U+FE0F (seletor de variação-16)Este último é usado para solicitar uma apresentação de emoji para o personagem anterior.
Você pode obter o resultado esperado
grapheme_clusters
ou enumerá-los viaeach_grapheme_cluster
: