Agora um pouco de tecnicidades (podem pular se nĂŁo quiserem ler um rant):
Eu torcia o nariz para emojis até reparar que eles foram os verdadeiros responsåveis por fazer programas e sites tomarem vergonha e darem mais valor para o
Unicode. Esse Ă© nada menos que o padrĂŁo que permite ter um texto usando nativamente caracteres de vĂĄrios sistemas de escrita sem que a gente tenha que especificar (e se limitar) a um sistema sĂł e sem que cada programa tenha que fazer isso de forma proprietĂĄria, gerando arquivos que nĂŁo funcionam com outros. Pense num site com um texto misturando o alfabeto romano, com acentuação, letras comuns em uma lĂngua mas raras em outras (Ă Ă© o clĂĄssico), ligaduras (ĂŠ...), ÄĂźÓÄĆĂŻĆ„ĂźÄĆĆ raros, unidades de medida (”Ω), um ı minĂșsculo sem ponto, um Ä° maiĂșsculo com ponto, kanji, um parĂĄgrafo de texto em hebraico no meio de texto em portuguĂȘs, etc. Uma coisa boba como copiar o texto e colar em um arquivo de texto comum (txt, sem formatação), depois copiar novamente o texto de lĂĄ, colar num email, enviar e ter a certeza que a pessoa do outro lado vai receber a coisa certa sĂł Ă© possĂvel por causa do Unicode. Quem Ă© das antigas lembra dos tempos do MS-DOS onde programas tinham que suportar explicitamente a
pågina de código 437 para a gente poder usar acentos, em arquivos que não iam funcionar em um sistema que usasse uma diferente e ainda hoje temos que lidar com codificaçÔes legadas como ISO 8859-1.
No começo, cada caracter usado em sistemas de escrita comuns recebeu um nome engraçadinho porĂ©m nĂŁo ambĂguo "Ă" Ă© "Latin capital letter a with acute", "Ă€" Ă© "Latin small letter a with diaresis" e "Ă" Ă© "Latin small letter sharp s", e um cĂłdigo formado por "U" seguido de nĂșmero em hexadecimal (U+00C1, U+00E4, U+00DF, respectivamente). Essa Ă© uma forma totalmente abstrata de representar a letra, que nĂŁo depende de fonte nem Ă© o que Ă© escrito nos arquivos ou enviado pela rede; Quem cuida dessa Ășltima parte Ă© a codificação Unicode, que varia em função do que Ă© mais prĂĄtico para cada situação (processar texto funciona melhor com
codificaçÔes de comprimento fixo, que sempre ocupam o mesmo espaço em memória e permite saltar para uma posição (com restriçÔes!), enquanto salvar e transmitir dados funciona melhor com
codificaçÔes de tamanho variĂĄvel, que economizam espaço). Mas o que importa Ă© que, semanticamente, "Ă" sempre vai ser U+00C1, "Ă€" serĂĄ U+00E4 e "Ă" serĂĄ U+00DF, e que podemos estender essa notação para belezinhas como "Tengwar letter silme" mantendo a separação semĂąntica com a "Tengwar letter silme nuquerna".
Ou deveria ser: Depois de um tempo reparou-se que dava para isolar uma letra base dos diacrĂticos usando regras de composição, basicamente montando caracteres aos pedaços na forma "Acento agudo" + "Letra e" ou, em unicodĂȘs: U+0065 (letra e) + U+0301 (acento agudo combinante). E programas que se virem com um processo de
normalização para quando precisarem saber que o "Ă©" composto Ă© igual ao "Ă©" precomposto. Mas tem a vantagem de separar uma coisa da outra, permite que a gente escreva o nome do Paul ErdĆs sem precisar de gambiarras, e funciona de um jeito muito elegante com abugidas como o Tengwar.
E tudo que acontece atĂ© agora Ă© "abstrato", usando apenas a semĂąntica das ideias que se deseja representar no texto, sem definir uma representação visual ou criar dependĂȘncia com fontes. Eu tentei nĂŁo usar a palavra "codepoint" aqui, mas Ă© onde o Unicode pĂĄra de especificar coisas... mapear o codepoint abstrato para uma forma visual (o glifo) Ă© coisa para as fontes e engines de renderização de texto, que tambĂ©m cuidam de ligaduras tipogrĂĄficas (juntar os traços dos "f"s e do "t" em "fft", etc.) e mapear mapear as versĂ”es compostas/precompostas de "Ă©" para o mesmo glifo (fechou o cĂrculo agora, nĂ©?). Juntando o tamanho das listas de caracteres do Unicode com as variaçÔes de estilo e peso de cada glifo, essas fontes tendem a ficar gigantescas e nada melhor como nĂŁo depender delas para expressar ideias -- eu linkei sĂł os emojis da Noto antes, mas a
versĂŁo completa dela Ă© um zip de quase 1 GB...
Emojis existiam antes de o Unicode se tornar popular (mas nĂŁo antes dele: Unicode 1.0 Ă© de 1991, culpa do Windows que demorou a migrar por causa da ideia infeliz de usar UTF-16; Linux e outros Unices usam UTF-8 e a migração foi bem mais rĂĄpida), mas sĂł pegaram no JapĂŁo. Ajuda que a codificação usada lĂĄ (JIS-X 208) era de 16 bits para ter espaço suficiente muitos kanji, o que tambĂ©m deixava algum espaço livre nas tabelas de caracteres. Oficialmente o espaço era reservado para uso futuro, mas as operadoras de telefonia, que muitas vezes tambĂ©m modificavam a FW dos telefones da Ă©poca para recursos prĂłprios das suas redes, nĂŁo davam a mĂnima para isso e adicionavam suas prĂłprias extensĂ”es mutuamente incompatĂveis... quando chegou a hora de migrar os sistemas para Unicode com codepoints padronizados, as operadoras fizeram o esperado: cada uma inventou seu prĂłpria codificação usando um pedaço diferente e incompatĂvel das ĂĄreas reservadas para uso privado â vocĂȘs nĂŁo estavam esperando bom-senso de operadoras de telefonia, nĂ©?
A coisa toda sĂł ficou um pouco menos zoada lĂĄ por 2010, quando o Unicode 6.0 padronizou alguns emojis para codepoints bem-definidos. Mas por pouco tempo ... lĂĄ pelo Unicode 8.0 a doideira descambou de vez quando se lançou a ideia de criar variantes de emojis usando um codepoint especial, o "Zero width joiner" (U+200D) para combinar emojis entre si. Basicamente ele permite juntar alguns emojis comuns e caracterĂsticas abstratas para gerar uma "frase" que a fonte mapeia para um glifo diferente. Ă um sistema parecido, mas diferente, daqueles usados para diacrĂticos combinantes.
Exemplos: hĂĄ codepoints para homem (
U+1F468), mulher (
U+1F469), e foguete (
U+1F680). Combinando com o Zero Width Joiner (ZWJ), dĂĄ para montar dois astronautas:
U+1F468 U+200D U+1F680
U+1F469 U+200D U+1F680
Eu
nĂŁo tenho ideia de como eles aparecem para vocĂȘs, porque Ă© trabalho do programa (na prĂĄtica uma biblioteca do sistema operacional), escolher a fonte certa e encontrar o glifo correspondente. Aqui aparece certo, mas um sistema que entenda a lĂłgica do ZWJ mas sem uma fonte com os glifos para os astronautas vai mostrar um "bloco" de um homem ou uma mulher ao lado de um foguete que Ă© selecionado como se fosse um caracter sĂł. Um sistema que nĂŁo entende o ZWJ mas que tenha uma fonte com os glifos individuais vai mostrar ambos separados pelo glifo de um "caracter substituto" (que Ă© o que o padrĂŁo diz para colocar no lugar das coisas que ele nĂŁo entende), que se comportam como caracteres separados. Nesse segundo caso, a fonte pode atĂ© ter os glifos para os astronautas, mas o sistema Ă© incapaz de usĂĄ-los porque nĂŁo entende a lĂłgica de seleção.
Olha o que acontece quando se troca o codepoint de foguete por um de aviĂŁo (â U+2708):
U+1F468 U+200D U+2708
U+1F469 U+200D U+2708
Do mesmo jeito, usando um cajado de esculĂĄpio (â U+2695) dĂĄ para fazer um mĂ©dico e uma mĂ©dica:
U+1F468 U+200D U+2695
U+1F469 U+200D U+2695
Repararam que (de novo, depende do sistema e das fontes) as figuras tem uma pele de cor irreal? Ă proposital para evitar qualquer suposição sobre a etnia das pessoas envolvidas... e foi a partir daqui que a coisa fica mais doida ainda: hĂĄ cinco codepoints modificadores de tons de pele (na sequĂȘncia, de clara para escura: U+1F3FB, U+1F3FC, U+1F3FD, U+1F3FE, U+1F3FF) que permitem selecionar o glifo aplicĂĄvel. EntĂŁo seguindo essa lĂłgica, para uma astronauta branca deverĂamos ter "Mulher + ZWJ + pele clara + ZWJ + foguete", certo?
Errado, modificador de tom de pele nĂŁo usa o ZWJ, ele simplesmente se aplica ao codepoint anterior, a sequĂȘncia certa Ă© U+1F469 U+1F3FB U+200D U+1F680 e a implementação que se vire com a lĂłgica disso...
Mas nĂŁo pode piorar, nĂ©? VocĂȘ acertou, pode sim ... Temos bandeiras nos emojis e Ă© muito legal colocar coisas como
e
e
, a lĂłgica nĂŁo pode ser muito diferente. Acertou de novo, pode. Bandeiras de paĂses* (esse asterisco vai te assombrar depois) nĂŁo usam sequĂȘncias de ZWJ, nem um indicador "combinador de bandeira + letras que indicam o paĂs", como a lĂłgica faria a gente imaginar. Existem 26 codepoints chamados de "sĂmbolos indicadores regionais", indo de U+1F1E6 (A) a U+1F1FF (Z), e um deles se combina automaticamente com o caracter anterior *se* esse caracter tambĂ©m for um indicador regional. EntĂŁo basta pegar o cĂłdigo ISO de duas letras do paĂs/regiĂŁo, colocar os codepoints na sequĂȘncia:
(U+1F1E7 REGIONAL INDICATOR SYMBOL LETTER B) + (U+1F1F7 REGIONAL INDICATOR SYMBOL LETTER R)
(U+1F1E9 REGIONAL INDICATOR SYMBOL LETTER D) + (U+1F1EA REGIONAL INDICATOR SYMBOL LETTER E)
(U+1F1EA REGIONAL INDICATOR SYMBOL LETTER E) + (U+1F1FA REGIONAL INDICATOR SYMBOL LETTER U)
Se esses codepoints nĂŁo sĂŁo letras mas sim um conceito abstrato para indicar sĂmbolos regionais e eles se combinam automaticamente com o codepoint anterior, eles nĂŁo deveriam ser exibidos quando alguĂ©m inventa de usĂĄ-los em avulso ... certo, certo?
Aà que entra a assombração do asterisco ... då para imaginar que algumas bandeiras são politicamente controversas e uma fonte que tenha um glifo desses
nĂŁo serĂĄ bem-vinda na China, mas para nĂŁo perder a semĂąntica, os indicadores avulsos aparecem como
(indicador regional T e W, coloquei um espaço entre eles para que aparecessem desse jeito independente da fonte). BTW, o iPhone oculta a bandeira de Taiwan removendo o glifo da fonte se a opção de localização estiver setada para a China, mas a sequĂȘncia continua a mesma.
Mas se os nomes dos codepoints sĂŁo "indicadores regionais" e servem para paĂses, paĂses* e entidades multinacionais como a UE, uma regiĂŁo nĂŁo disputada, onde as partes entendem que sĂŁo paĂses pertencentes a um reino relativamente unido, nĂŁo deve ter problema, nĂ©? Ooops: Inglaterra, Gales e EscĂłcia tem regras de formação completamente diferentes usando uma regiĂŁo totalmente distinta dos codepoints:
U+1F3F4 U+E0067 U+E0062 U+E0065 U+E006E U+E0067 U+E007F Inglaterra
U+1F3F4 U+E0067 U+E0062 U+E0073 U+E0063 U+E0074 U+E007F EscĂłcia
U+1F3F4 U+E0067 U+E0062 U+E0077 U+E006C U+E0073 U+E007F Gales
Ă meio difĂcil de interpretar. A sequĂȘncia da bandeira da Inglaterra fica:
CĂłdigo:
U+1F3F4 WAVING BLACK FLAG
U+E0067 TAG LATIN SMALL LETTER G
U+E0062 TAG LATIN SMALL LETTER B
U+E0065 TAG LATIN SMALL LETTER E
U+E006E TAG LATIN SMALL LETTER N
U+E0067 TAG LATIN SMALL LETTER G
U+E007F CANCEL TAG
Se Ă© complicado ser um paĂs nos emojis entĂŁo deve ser mais fĂĄcil ser pirata, nĂŁo? E se tem um codepoint para "bandeira negra" que se combina com outros sem um ZWJ, como fazer uma bandeira pirata (
) ? Usando um ZWJ !!! Essa bandeirinha Ă© formada pelo mesmo "Waving black flag" usado acima, (
U+1F3F4), seguido de um ZWJ (U+200D), seguido de "Situação atual do Olavo" (
U+2620) ... Temos uma exceção dentro da exceção dentro da exceção!
A insanidade Ă© completa, mas pelo menos as sequĂȘncias oficialmente suportadas estĂŁo bem documentadas:
https://unicode.org/Public/emoji/14.0/emoji-sequences.txt
Agora voltando para as regras de composição mais convencionais... muita gente jĂĄ viu esses emojis de famĂlia:
SĂŁo muito legais porque dĂĄ para montar vĂĄrias combinaçÔes sem dificuldade. Esse aĂ, por exemplo, Ă©:
U+1F468 MAN
U+200D ZERO WIDTH JOINER
U+1F469 WOMAN
U+200D ZERO WIDTH JOINER
U+1F467 GIRL
U+200D ZERO WIDTH JOINER
U+1F466 BOY
Basta copiar esses codepoints e dĂĄ para montar a famĂlia que vocĂȘ quiser e tem opçÔes para "Old man" e "Old woman" tambĂ©m. A regra permite usar definiçÔes de tom de pele para cada integrante da famĂlia mas as fontes que tenho aqui nĂŁo tem os glifos para todas elas (eu perdĂŽo porque Ă© complicado desenhar todas as combinaçÔes possĂveis, vide os quase 1 GB de fontes do arquivo que linkei lĂĄ em cima), mas o bom Ă© que tem um fallback:
â
â
â
aqui aparece como um glifo sĂł combinando os glifos individuais com todos os familiares ao lado um do outro... uma versĂŁo nova da fonte, que tenha o glifo correto, vai colocĂĄ-la na figurinha como da anterior. Estava tentando montar uma famĂlia de vĂĄrias etnias aqui, mas acho que abusei da fonte e a renderização se perdeu. Mas Ă© uma combinação vĂĄlida, talvez numa versĂŁo nova funcione. Infelizmente eu nĂŁo consegui colocar nenhuma das variaçÔes grĂĄvidas dentro da famĂlia e nĂŁo sei se Ă© suportado, entĂŁo esse camarada vai ter que esperar:
E agora uma coisa que muita gente pode ter feito isso sem perceber, mas tendo o contexto fica mais legal: copie esse emoji de famĂlia aqui
para a a caixa de resposta, coloque o cursor no final e vĂĄ dando backspace. As pessoas da famĂlia vĂŁo sumindo uma a uma e as vezes vocĂȘ precisarĂĄ dar um backspace extra para apagar cada ZWJ.
Unicode nĂŁo Ă© perfeito, tem complexidades, essa ambiguidade das formas compostas e decompostas, toda a
polĂȘmica da Unificação Han, homoglifos (duvida? tem trĂȘs versĂ”es do "a" diferentes aqui: "ÎĐA" um grego, outro cirĂlico e outro latino... para sorte de nĂłs, programadores, tem bibliotecas para lidar com isso transparentemente),
muita treta polĂtica e religiosa, etc. mas funciona. E os emojis abusam de toda regra possĂvel dele, entĂŁo um site/programa que queira mostrĂĄ-los corretamente nĂŁo tem opção a nĂŁo ser
implementar essa coisa direito e todos nĂłs ganhamos â mesmo quem nĂŁo quer saber de emojis.
O que me deixa
realmente furioso, porém, é que Tengwar é um cidadão de segunda classe no Unicode (repararam que eu não coloquei os codepoints lå?) ... a proposta oficial estå eståvel
desde 1997 e ainda nĂŁo foi oficializada, o que nos obriga a se virar com as ĂĄreas de uso privado,
desde 1993. Ou a codificação Dan Smith, que é como nos viramos no fórum por enquanto. Ao menos existe uma
coordenação voluntåria para atribuir caracteres nas åreas de uso privado sm criar conflitos, mas continua sendo algo extraoficial.
E o Loki? Fico triste que nĂŁo dĂĄ para montar um Sleipnir colocando pernas adicionais num cavalo comum, mas pelo menos o mecanismo estĂĄ aĂ. E convenhamos, o Deus da Trapaça deve se dar muito bem com essas regras de emojis...