Executando verificação de segurança...
3

Algumas considerações sobre ASCII:

Se estiver trabalhando com ASCII, certamente o problema não irá ocorrer pois é uma tabela com apenas 256 códigos e cada código ocupa sempre um byte (0-255). A composição da tabela é a seguinte:

  • 0-31 caracteres de controle.

  • 32-127 caracteres imprimíveis (+ - A a 9 / etc.).

  • 128-255 código estendidos.

Os códigos de 128-255 podem corresponder a símbolos diferentes dependendo da implementação. Mas continuam sendo um byte então, inverter uma string sempre vai funcionar. O problema aqui é que o À de uma tabela pode corresponder a um Ŕ da implementação em outra. Por exemplo:

ASCII Windows-1250 char(192) = Ŕ

ASCII ISO-8859-1 char(192) = À

Pessoalmente acho o Unicode muito bagunçado, no sentido de ter muita coisa inútil. Nem todas as fontes ttf possuem representação para todos os símbolos. Na realidade, algumas não possuem nem acentuação.

Acho os emoji legais para aquelas cartas enigmáticas que as crianças fazem. :D

O 🌞 + ⚄ foi 💤

Sobre o texto, me ocorre o que eu penso:

"O programador tem que escrever códigos legíveis e corretos mas ninguém ajuda o pobre coitado. Quem implementa os compiladores/interpretadores não pensa em facilitar a vida do programador que desenvolve sistemas para o mundo real.™. Este, por sua vez e com seu sangue de barata, acha que está tudo certo."

Eu penso que um caractere deixou de ser um byte há muito tempo. Uma string é uma sequência de caracteres e não de bytes. Vamos ignorar os emojis e se concentrar em um texto padrão. Supondo Josi e José.

  • Quem vem primeiro em ordem alfabética crescente? José < Josi

  • Como ficará a conversão para maiúsculas dos nomes? José => JOSÉ

  • Se procurar por Jose o programa vai encontrar? José = Jose

Não uso Ruby, mas acho que isso deveria ser normal para qualquer linguagem que se preze (teria que ver se COBOL já não é assim). Caso contrário, eu considero beta, acadêmica ou prova de conceito (sim, eu uso linguagens que ainda são beta ;-) ).

image

Carregando publicação patrocinada...
3

Complementando...

O ASCII original só tinha 128 caracteres. Aí perceberam que tinha mais 128 "sobrando", e que ainda sim caberia em um byte.

Vários tiveram essa ideia ao mesmo tempo e cada um criou seu próprio mapeamento - como vc disse, cada valor entre 128 e 255 poderia ser um caractere completamente diferente, dependendo do mapeamento.

Esses mapeamentos eram chamados de code pages, e foram criados vários (ISO-8859-1 é um dentre as dezenas de code pages existentes).

Fiz um post bem detalhado sobre isso aqui.


Quanto ao Unicode, concordo que ele deveria ser menos bagunçado. Há muitos blocos de miscelaneous, que agrupam caracteres que não tem relação nenhuma entre si, fora a zona que virou os emojis.

Já sobre o fato de nem todas as fontes suportarem todos os caracteres, eu fico meio dividido. Por um lado, entendo que o Unicode está mais preocupado em organizar a bagunça que é esse monte de caracteres usados no mundo todo, então cada um que se vire pra dar o suporte adequado a cada nova versão que sai. Por outro lado, talvez devesse ter uma preocupação a mais com esse aspecto (os "clientes diretos" do Unicode).

Mas acho que é algo difícil de gerenciar e resolver: imagine se além dos problemas que eles já tem, ainda tivessem que dar suporte para todas as fontes existentes. Enfim...


Quem vem primeiro em ordem alfabética crescente? José < Josi

Depende. Cada idioma possui uma regra diferente, alguns colocam as letras acentuadas depois. E também podem ter casos em que eu precise de uma ordem específica e customizada.

Inclusive, muitas linguagens/bibliotecas possuem opções para configurar estas regras. Mais detalhes aqui.

Como ficará a conversão para maiúsculas dos nomes? José => JOSÉ

Também depende, cada idioma possui suas regras. Em alguns a versão maiúscula ou minúscula muda dependendo da posição da letra na palavra. Outros não se limitam a ter maiúsculas e minúsculas e possuem uma terceira forma chamada titlecase. E em outros idiomas, como o japonês, sequer existem os conceitos de "letra maiúscula e minúscula".

Sei que nada disso se aplica ao seu exemplo, foi só pra ilustrar que quando estamos falando de caracteres, temos que definir bem o escopo. Se for "somente textos em português", por exemplo, aí as regras que vc descreveu se encaixam perfeitamente. Contexto é tudo.

Se procurar por Jose o programa vai encontrar? José = Jose

Também depende do contexto. Se eu procurar pela palavra "sabia", também deveria encontrar "sabiá" e "sábia"?

Se for nome próprio, piorou, pois existe Fabio sem acento por exemplo, então neste caso seria melhor diferenciar de Fábio pra não trazer muitos falsos positivos.

Enfim, não dá pra cravar regras absolutas nem pra essas coisas que parecem "óbvias". Sempre depende do contexto.

Hoje a maioria das linguagens mainstream possui um suporte adequado ao Unicode e também permite configurar os detalhes que mencionei acima.

Quanto ao código Ruby que converte a string para bytes, vale lembrar que o resultado depende do encoding usado. Pelo jeito o Ruby usa UTF-8 por default. Mas veja como dá diferença se usar outro (código em Python):

s = "José"
 
for enc in ("utf-8", "utf-16", "latin1", "utf-32"):
    print(f"{enc} - {','.join(map(str, s.encode(enc)))}")

A saída é:

utf-8 - 74,111,115,195,169
utf-16 - 255,254,74,0,111,0,115,0,233,0
latin1 - 74,111,115,233
utf-32 - 255,254,0,0,74,0,0,0,111,0,0,0,115,0,0,0,233,0,0,0

Por fim, concordo com e reforço a sua afirmação de que a ideia de "1 caractere = 1 byte" está ultrapassada há muito tempo (e me espanta como a esmagadora maioria dos cursos ignora esse fato, é só ver a quantidade de devs que chega ao mercado sem ter a menor noção disso).

2

Desculpe. Faltou contexto. Posso alegar que estava indignado com a minha internet que passou, praticamente todo o dia assim: https://postimg.cc/G8s5J4Zz

Sim, estava falando de Português. Cada idioma terá suas regras. Os nomes são de pessoas e é para coisa pequena. Se for um cadastro, provavelmente vai estará em uma tabela e o SGBD terá os recursos para tal, tipo CHARSET UTF8 COLLATION UNICODE_CI_AI (case-insensitive, accent-insensitive) e variantes.

Ruby e diversas outras linguagens adotam UTF8 como padrão. Mas algumas ainda retornam o tamanho de uma string em bytes (é necessário um trabalho extra para as coisas funcionarem corretamente).

Se faltou contexto agora é que estou cansado. :D

Off topic

Depois olho o teu blog. Mas vi que tem um tópico sobre Data/Horas x Duração e eu citei anteriormente que as linguagens devem facilitar a vida do programador. Unidades é outro ponto que acho importante em linguagens de programação. Exemplo em Red (linguagem beta e que ninguém usa) para comparar com os exemplos do teu blog

ponto: [8:00 17:00 8:15 18:30 9:30 18:30]
total: 0:00
foreach [entrada saida] ponto [
   total: total + saida - entrada
]
print ["total: " total]

>> total: 28:15:00