Nas Ășltimas semanas, Nikita Prokopov implementou suporte a emoji para Skija . Ele decidiu compartilhar alguns pequenos detalhes de como essa "maior inovação na comunicação humana desde a invenção da carta
" funciona nos bastidores.
Nota do tradutor: Habr nĂŁo suporta emoji, entĂŁo eu tive que sair e substituir o emoji por imagens.
Unicode
Cada personagem em um computador Ă© codificado com um nĂșmero. A codificação mais popular Ă© Unicode e as duas subvariantes mais comuns sĂŁo UTF-8 e UTF-16.
O Unicode aloca 2 21 (2 milhĂ”es) de caracteres chamados "pontos de cĂłdigo". Destes dois milhĂ”es, apenas ~ 150k caracteres estĂŁo atualmente definidos. Todas as lĂnguas, mortas e vivas, e outras decoraçÔes foram amontoadas nesses 150.000 sĂmbolos. VocĂȘ pode usar fontes diferentes para trĂĄs escrever e de cabeça para baixo:
assim como a exibição de «GHz» como um Ășnico glifo:
.
Dirigida para a seta de duas pontas direita com penas e duas linhas verticais:
ou Semiglazov Monstro:
. E o pato:
Preste atenção ao bloco com hierĂłglifos egĂpcios (U + 13000 - U + 1342F), hĂĄ muitas coisas interessantes:
Emoji bĂĄsico
Emoji sĂŁo apenas caracteres Unicode, que estĂŁo localizados aqui U + 1F300-1F6FF e aqui U + 1F900-1FAFF:
Emoji se comportam como letras comuns, vocĂȘ pode fazer todas as operaçÔes com eles, como com letras ( aproximadamente traduzido: mas nĂŁo em HabrĂ©! ). Quando vocĂȘ digita âAâ, o computador vĂȘ U + 0041. Quando vocĂȘ digita, o
computador vĂȘ U + 1F335.
Emoji sĂŁo fontes
Por que eles sĂŁo exibidos como imagens? Fontes de bitmap. VocĂȘ pode criar um PNG engraçado para glifos em vez de vetores chatos em preto e branco.
Cada sistema operacional vem com uma fonte emoji pré-instalada. No macOS / iOS, este é o Apple Color Emoji. Windows - Segoe UI Emoji, Android - Noto Color Emoji.
Emojis, como fontes, tĂȘm uma aparĂȘncia diferente em dispositivos diferentes. Alguns aplicativos tĂȘm seus prĂłprios emojis: WhatsApp, Twitter, Facebook.
Fontes alternativas
VocĂȘ escreve o texto em alguma fonte, como o emoji se encaixa aĂ? E por que o texto em russo parece pobre no Clubhouse ou no Medium?
Aqui vocĂȘ estĂĄ digitando o caractere U + 1F419 e sua fonte Ă©, por exemplo, San Francisco. Mas a fonte San Francisco nĂŁo tem um glifo para U + 1F419, entĂŁo seu sistema operacional começa a procurar por outra fonte que tenha esse glifo.
U + 1F419 estĂĄ disponĂvel apenas em Apple Color Emoji. EntĂŁo vocĂȘ vĂȘ o seguinte:
.
Qualquer que seja a fonte usada, os emojis tĂȘm a mesma aparĂȘncia.
Seletor de variação-16
Alguns emojis se originaram na forma de Ăcones em 1993, nas seçÔes Miscellaneous Symbols U + 2600-26FF ou Dingbats U + 2700-27FF:
Esses glifos sĂŁo como letras, preto e branco. Muitas fontes tĂȘm suas prĂłprias
(U + 2702 TESOURA PRETA):
Apple Color Emoji tem sua prĂłpria versĂŁo:
Como o sistema operacional sabe o que exibir
ou
se eles tĂȘm o mesmo cĂłdigo U + 2702?
Conheça U + FE0F, tambĂ©m conhecido como SELETOR DE VARIAĂĂO-16. Esta Ă© uma dica para o renderizador de texto alternar para emoji.
Simples, elegante e sem necessidade de destacar novos pontos de cĂłdigo.
tĂȘm o mesmo
significado , mas um estilo de imagem ligeiramente diferente.
Aglomerados de grafemas
Aqui nos deparamos com outro problema - nossos emojis agora nĂŁo sĂŁo um ponto de cĂłdigo, mas dois. Isso significa que precisamos definir os limites do sĂmbolo.
Um aglomerado de grafemas nos ajudarĂĄ. Um cluster de grafema Ă© uma sequĂȘncia de pontos de cĂłdigo que Ă© vista como um Ășnico glifo legĂvel por humanos.
Os clusters de grafemas foram inventados nĂŁo apenas para emojis, mas tambĂ©m aplicĂĄveis ââa alfabetos regulares.
Ă um Ășnico agrupamento de grafemas, mesmo que consista em dois pontos de cĂłdigo: U + 0055 MAIĂSCULAS U ââseguido por U + 0308 DIAERESE COMBINADA.
Os clusters Grapheme apresentam muita complexidade para os programadores. VocĂȘ nĂŁo pode simplesmente fazer
substring(0, 10)
para pegar os primeiros 10 caracteres - vocĂȘ pode dividir o emoji ao meio.
O reverso da linha deve ser feito de forma inteligente. U + 263A U + FE0F faz sentido, mas U + FE0F U + 263A nĂŁo.
Finalmente, vocĂȘ nĂŁo pode simplesmente invocar
.length
string. Bem, vocĂȘ pode, mas o resultado vai te surpreender. Se vocĂȘ for um desenvolvedor, tente executar
no console do seu navegador.
Dica para o programador: se vocĂȘ estiver trabalhando com texto, obtenha uma biblioteca focada em clusters de grafemas. Para C, C ++ e JVM pode ser ICU , Swift faz tudo certo por padrĂŁo, para os outros - faça vocĂȘ mesmo.
Essa coisa tem 65 de comprimento e nĂŁo pode ser dividida. Viva com isso agora.
Modificador de tom de pele
A maioria dos emojis humanos representa uma pessoa amarela abstrata. Quando o tom de pele foi adicionado em 2015, em vez de adicionar um novo ponto de código para cada combinação de emoji e tom de pele, apenas cinco novos pontos de código foram adicionados: U + 1F3FB..U + 1F3FF
Eles nĂŁo devem ser usados ââsozinhos, mas devem ser adicionados a emoji existente ... Juntos, eles formam uma ligadura: se imprimirmos
(U + 1F44B WAVING HAND SIGN) e depois (U + 1F3FD MODIFICADOR DE TOM DE PELE MĂDIO), veremos que
nĂŁo tem seu prĂłprio ponto de cĂłdigo (esta Ă© uma sequĂȘncia de dois: U + 1F44B U + 1F3FD), mas tem sua prĂłpria aparĂȘncia e comportamento Ășnicos. No total, com a ajuda de cinco modificadores, ~ 280 emojis humanos foram transformados em 1680 variaçÔes. Aqui estĂŁo alguns dançarinos:
Joiner de largura zero
Digamos que seu amigo acabou de enviar a vocĂȘ a foto de uma maçã que ela estĂĄ cultivando em seu jardim. VocĂȘ precisa responder - como? VocĂȘ pode enviar
WOMAN EMOJI (U + 1F469) com a
almofada de arroz SHEAF OF RICE (U + 1F33E) anexada
. No final, vai funcionar
, mas se vocĂȘ bater U + 200D entre eles, vocĂȘ terĂĄ um fazendeiro:
U + 200D Ă© chamado de Marceneiro de Largura Zero, ou ZWJ para abreviar. Funciona de forma semelhante ao que vimos com o tom de pele, mas desta vez vocĂȘ pode combinar dois emojis independentes em um. Nem todas as combinaçÔes funcionam, mas muitas funcionam, Ă s vezes de maneiras surpreendentes!
Alguns exemplos:
Uma inconsistĂȘncia estranha que notei Ă© que a cor do cabelo Ă© feita por meio do ZWJ, enquanto o tom da pele Ă© apenas um modificador de emoji sem ZWJ. Por quĂȘ? Eu nĂŁo faço ideia.
Infelizmente, alguns emojis não são implementados como combinaçÔes com ZWJ. Eu considero esta uma oportunidade perdida:
Como imprimir ZWJ? Sem chance. Mas vocĂȘ pode copiĂĄ-lo aqui: ââ. Nota: este Ă© um caractere especial, portanto, espere que ele se comporte de maneira estranha. VocĂȘ nĂŁo o vĂȘ, mas ele Ă©. ( nota por: no artigo original existe, mas Habr nĂŁo permite )
Outra grande ĂĄrea onde ZWJ estĂĄ a cavalo Ă© a configuração de famĂlias e relacionamentos. Aqui estĂĄ uma pequena histĂłria para ilustrar:
Bandeiras
Sinalizadores de paĂs sĂŁo parte do padrĂŁo Unicode, mas por algum motivo nĂŁo sĂŁo implementados no Windows. Se vocĂȘ estĂĄ lendo isso em um navegador Windows - desculpe!
Sinalizadores nĂŁo tĂȘm pontos de cĂłdigo dedicados. Em vez disso, sĂŁo ligaduras de duas letras.
Esquerda - Windows, direita - Mac
Verdade, eles nĂŁo usam letras reais. Em vez disso, o alfabeto de âletra de sĂmbolo indicador regionalâ (U + 1F1E6..1F1FF) Ă© usado. Essas letras nĂŁo sĂŁo usadas para nada alĂ©m de bandeiras de composição.
O que acontece se vocĂȘ colocar duas letras aleatĂłrias juntas? NĂŁo muito:
(exceto que a edição de texto começa a se comportar de maneira estranha).
Se vocĂȘ quiser experimentar, fique Ă vontade para copiar e combinar este alfabeto:
Existem 258 combinaçÔes vĂĄlidas de duas letras. VocĂȘ pode encontrar todos eles?
Um efeito colateral divertido da ligadura de duas letras:
SequĂȘncias de tags
Ligaduras de duas letras sĂŁo legais, mas vocĂȘ nĂŁo quer ser mais legal? Que tal ligaduras de 32 letras? Aqui estĂŁo as sequĂȘncias de tags.
Uma sequĂȘncia de tag Ă© uma sequĂȘncia de emoji regular, seguida por outro tipo de letras latinas (U + E0020..E007E), terminando com U + E007F CANCELAR TAG.
Atualmente, elas sĂŁo usadas apenas para estas trĂȘs bandeiras: Inglaterra, EscĂłcia e PaĂs de Gales:
Keycaps
NĂŁo Ă© superexcitante, mas Ă© necessĂĄrio para ser completo: as sequĂȘncias de teclas usam outra convenção.
Ele se parece com isto: pegue um nĂșmero * ou #, transforme-o em um emoji com U + FE0F, embrulhe-o em um quadrado com U + 20E3 COMBINANDO O KEYCAP DE ENCERRAMENTO
Existem 12 deles:
AtualizaçÔes Unicode
O Unicode é atualizado todos os anos e os emoji são uma parte essencial de cada lançamento. Por exemplo, em Unicode 13 (março de 2020) 55 novos emojis foram adicionados.
No momento em que este artigo foi escrito, nem o Mac OS (11.2.3) nem o iOS (14.4.1) suportavam emoji do tipo Unicode 13:
Aqui estå o que vejo em março de 2021:
Mas graças à magia do ZWJ, ainda posso entender o que acontece não é da maneira mais ideal.
ConclusĂŁo
Para resumir, existem sete maneiras de codificar emoji:
- Ponto de cĂłdigo Ășnico

- Ponto de cĂłdigo Ășnico + seletor de variação-16

- Modificador de tom de pele

- Sequenciamento com junta de largura zero

- Bandeiras

- SequĂȘncia de tags

- SequĂȘncia de tecla

Métodos de 1 a 4 podem ser combinados para construir uma postagem bastante complexa:
Se vocĂȘ for um programador, lembre-se de sempre usar a biblioteca ICU para:
- extração de substring
- medidas de comprimento de linha
- corda reversa
A palavra-chave googling Ă© "Grapheme Cluster". Isso se aplica a emojis, diacrĂticos ocidentais, fontes induzidas e coreanas, portanto, tome cuidado.
- O primeiro sistema de controle serial da RĂșssia para um motor bicombustĂvel com separação funcional de controladores
- Existem mais linhas de cĂłdigo em um carro moderno do que ...
- Cursos Online GrĂĄtis em Automotivo, Aeroespacial, RobĂłtica e Engenharia (50+)
- McKinsey: repensando o software eletrĂŽnico e a arquitetura automotiva
Sobre ITELMA
Lista de publicaçÔes Ășteis sobre HabrĂ©