2020-05-24 – De volta dos caracteres multi-byte nos terminais de Linux em C++
Uma imagem de 24 de Maio, em que andava de volta do problema dos caracteres multi-byte, ao criar o Cisco IOS Simulator.
Descrição da altura:
«Algo que muitos não imaginam que se tem de programar quando se cria algo do zero. Os caracteres multi-byte. E irei explicar porque vêem nas imagens linhas com metade do tamanho, e caracteres esquisitos.
Para quem não sabe, um caractere é representado por um byte (normalmente), e um byte vai de 0 a 255. MAS, só metade deles são usados por norma para representar os caracteres que usamos no dia-a-dia, os de 0 a 127, ou melhor, 32-127.
Mas isto não chega para todos os caracteres, onde ficam então os “ÇçáèóÙú”, etc? E os caracteres Chineses, e etc?
Esses terão de ser representados por vários bytes, 2, 3, etc.
Os Portugueses são representados por norma por 2 bytes, como o “Ç” que é representado pelos bytes 195 e 67.
Agora, eu estava a meio deste código, e não tenho isto a contar correctamente o tamanho de cada linha, ele conta cada “ç” como sendo 2 bytes, e como tem o limite de 80 bytes por linha (80 chars), as linhas com ç ainda ficam a ocupar só metade.
Além disso, como ele não os reconhece como tendo 2 bytes cada, ele corta-os ao meio, ao chegar à posição 80 de cada linha, mete metade do caractere ç numa linha (o byte 195) e o byte 67 na seguinte, e assim aparecem 2 sinais estranhos, pois aquilo não é um ç.
Abaixo, meto um “o” no meio, e isto é suficiente para fazer com que o último “ç” da linha ocupe as colunas 79 e 80, e na linha seguinte, as 0 e 1, e já fica tudo bem.
Isto claro está errado, tenho de preparar esta parte, para que os caracteres sejam bem contados, e a consola fique a funcionar bem.
Isto faz parte do simulador de routers Cisco que estou a desenvolver, o simulador em si nem aceita “ç” porque os routers não aceitam, eu não precisava de estar a ter este trabalho pois lá cada caractere só ocupa um byte, mas estou a tê-lo porque um dia vou utilizar isto no universal translator que vou desenvolver.
De qualquer das formas, espero que tenham gostado de ver mais um passo do que é criar algo do zero, aquilo que dão como garantido todos os dias ao usar, mas que dá mais trabalho do que parece ao ser criado do zero.
2020-05-24.»