Muito trabalho inicial foi feito com códigos baudot de 5 bits, mas esses rapidamente se tornaram bastante limitantes (apenas 32 caracteres possíveis, basicamente apenas letras maiúsculas e alguns sinais de pontuação, mas não há espaço suficiente para dígitos) .
A partir daí, algumas máquinas passaram a caracteres de 6 bits. No entanto, isso ainda era bastante inadequado - se você quisesse letras e dígitos em maiúsculas e minúsculas (em inglês), isso deixava apenas mais dois caracteres para pontuação, portanto, a maioria ainda tinha apenas um caso de letras em um conjunto de caracteres.
ASCII definiu um conjunto de caracteres de 7 bits. Isso foi "bom o suficiente" para muitos usos por um longo tempo e também formou a base da maioria dos conjuntos de caracteres mais recentes (ISO 646, ISO 8859, Unicode, ISO 10646 etc.)
Os computadores binários motivam os designers a criar tamanhos de dois. Como o conjunto de caracteres "padrão" exigia 7 bits de qualquer maneira, não era muito difícil adicionar mais um bit para obter a potência de 2 (e, nessa época, o armazenamento estava se tornando mais barato do que "desperdiçar" um pouco para a maioria dos caracteres). era mais aceitável também).
Desde então, os conjuntos de caracteres passaram para 16 e 32 bits, mas a maioria dos computadores convencionais se baseia amplamente no PC IBM original. Por outro lado, o suficiente do mercado está suficientemente satisfeito com os caracteres de 8 bits que, mesmo que o PC não tivesse atingido seu nível atual de domínio, não tenho certeza se todo mundo faria tudo com caracteres maiores de qualquer maneira.
Devo acrescentar também que o mercado mudou bastante. No mercado atual, o tamanho dos caracteres é definido menos pelo hardware que pelo software. Windows, Java etc. foram movidos para caracteres de 16 bits há muito tempo.
Agora, o obstáculo ao suportar caracteres de 16 ou 32 bits é minimamente das dificuldades inerentes aos próprios caracteres de 16 ou 32 bits e, em grande parte, da dificuldade de suportar o i18n em geral. Em ASCII (por exemplo), detectar se uma letra é maiúscula ou minúscula ou converter entre as duas é incrivelmente trivial. No Unicode / ISO 10646 completo, é basicamente indescritivelmente complexo (a ponto de os padrões nem tentarem - eles fornecem tabelas, não descrições). Em seguida, você adiciona o fato de que, para alguns idiomas / conjuntos de caracteres, mesmo a idéia básica de maiúsculas / minúsculas não se aplica. Depois, você adiciona o fato de que até a exibição de caracteres em alguns deles é muito mais complexa ainda.
Tudo isso é suficientemente complexo que a grande maioria dos softwares nem tenta. A situação está melhorando lentamente, mas lentamente é a palavra operativa.