Microblogue

Microblogue

Fácil

Instruções

Identificaste uma lacuna no mercado das redes sociais para publicações muito, muito curtas. Agora que o Twitter permite publicações de 280 carateres, quem quer atualizações rápidas nas redes sociais não está a ser servido. Decides criar a tua própria rede social.

Para tornar o teu produto digno de nota, tornas-lo extremo e só permites publicações de 5 carateres ou menos. Qualquer publicação com mais de 5 carateres deve ser truncada para 5.

Para permitires que os teus utilizadores se expressem livremente, permites Emoji e outros carateres Unicode.

A tarefa é truncar as strings de entrada para 5 carateres.

Codificações de texto

O texto guardado digitalmente tem de ser convertido numa série de bytes. Há 3 formas de mapear carateres para bytes em uso comum.

  • O ASCII consegue codificar carateres da língua inglesa. Todos os carateres têm exatamente 1 byte.
  • O UTF-8 é uma codificação de texto Unicode. Os carateres ocupam entre 1 e 4 bytes.
  • O UTF-16 é uma codificação de texto Unicode. Os carateres têm 2 ou 4 bytes.

Tanto o UTF-8 como o UTF-16 são codificações Unicode, o que significa que conseguem representar uma enorme variedade de carateres, incluindo:

  • Texto na maioria das línguas e sistemas de escrita do mundo
  • Texto histórico
  • Emoji

Tanto o UTF-8 como o UTF-16 são codificações de comprimento variável, o que significa que carateres diferentes ocupam quantidades diferentes de espaço.

Repara na letra 'a' e no emoji '😛'. Em UTF-16, a letra ocupa 2 bytes, mas o emoji ocupa 4 bytes.

O truque deste exercício é usar APIs concebidas em torno de carateres Unicode (codepoints) em vez de codeunits Unicode.

Pontos de código Unicode vs unidades de código.

Uma string codificada em UTF-16 "normal" pode ser representada como uma série de carateres, em que cada caráter pode ter até 16 bits de comprimento (daí o nome UTF-16). Isto significa que há um máximo de 2¹⁶ (dois elevado a dezasseis), ou 65536 carateres possíveis representáveis com 16 bits, ou 1 unidade de código. Estes 65536 carateres formam o que se conhece como o Basic Multilingual Set, que é suficientemente grande para os carateres mais comuns da maioria das línguas.

No entanto, alguns símbolos não cabem numa única unidade de código. A solução é representá-los com duas unidades de código. Estas duas unidades de código UTF-16, muitas vezes designadas por surrogate pair, formam um ponto de código.

Resumindo, quando falamos de codificação UTF-16:

  • Uma code unit corresponde a 16 (ou menos) bits que representam um único caráter.
  • Um code point corresponde a uma ou duas unidades de código que representam um único caráter.

Para complicar ainda mais as coisas, existem também os grapheme clusters, que são basicamente sequências de carateres Unicode (pontos de código) que devem ser tratadas como uma única unidade visual. Por exemplo, alguns emojis, como este 👨‍👦.

UTF-16 em Javascript

A maioria dos métodos incorporados do Javascript funciona com strings codificadas em UTF-16, mas baseia-se em unidades de código UTF-16. Por exemplo, o método String.prototype.split("") separa uma string por unidades de código.

Por outro lado, os String iterators iteram por pontos de código.

Podes ler muito mais, e encontrar exemplos sobre strings Unicode, em MDN.

Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Microblogue?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.