paulo1205
(usa Ubuntu)
Enviado em 15/03/2018 - 02:51h
CarlosVinicius escreveu:
Como armazeno 'ã' no char1?
#include <stdio.h>
int main()
{
char char1 = 'ã';
printf("Avião\n");
printf("%c\n",char1);
}
Depende. Você está usando qual sistema operacional, e com que configuração de idioma e locales?
Se for uma distribuição de Linux, o mais provável é que o locale esteja configurado para pt_BR.UTF-8 ou en_US.UTF-8. A parte “pt_BR” indica idioma Português na variante do Brasil (ou Inglês, na variante dos Estados Unidos), e codificação de caracteres em UTF-8.
A codificação UTF-8 é uma forma de representar o Unicode que utiliza uma quantidade variável de bytes para designar cada símbolo definido pelo Unicode. Os símbolos com índice entre 0 e 127 são representados com um único byte, aqueles entre 128 e 2047 ocupam dois bytes, os de índice entre 2048 e 65535 requerem três bytes, e aqueles entre 65536 e 1114111 (que é o atual limite do Unicode) usam 4 bytes.
Note que eu estou usando a palavra “símbolo” para fazer distinção entre o caráter do C (
char), que nos nossos PCs permite representar um único
byte, e os sinais que aparecem impressos na tela ou no papel.
Saida do gcc:
text.c: In funcionários 'main'
texto.c:5:15: warning: mult-character constant [-Wmultichar]
char chat 1 = 'ã';
^~~~
texto.c:5:15: warning: overflow in implicit constant conversion [-Woverflow]
Como o símbolo “ã” corresponde ao código 225 no Unicode, sua representação em UTF-8 ocupa dois bytes. Se o seu editor de textos estiver honrando a configuração UTF-8 do sistema operacional, como parece estar fazendo, embora você só veja um símbolo na tela quando edita ou exibe o arquivo, o arquivo efetivamente possui dois bytes (com valores 0xC3 e 0xA3) naquele ponto em que você tenta atribuir um valor à variável
char1. Quando o compilador lê o arquivo, ele vê dois bytes entre os sinais de apóstrofo, os quais não correspondem a uma sequência de escape válida, e, portanto, emite o alerta que você transcreveu.
Se você quiser trabalhar com acentuação, você tem mais de uma alternativa. Entre mais comumente empregadas, destaco as seguintes:
• Mudar a configuração do sistema para trabalhar com um conjunto de caracteres de 8 bits que acomode todos os símbolos de que você vai precisar. Para o Português, geralmente as codificações ISO-8859-1 (compatível com os primeiros 256 símbolos do Unicode), ISO-8859-15 (uma variação do ISO-8859-1, incompatível com Unicode, que substituiu oito símbolos pouco usados pelo símbolo do € e alguns caracteres usados em Francês e línguas bálticas) e CP1252 (usada pelo Windows) costumam servir. Isso é um tanto limitante em comparação com aplicações modernas que usam Unicode corriqueiramente. Além do mais, você teria de tomar cuidado com o fato de que, na maioria dos nossos PCs,
char tem valores que, ao serem convertidos para inteiros, vão de -128 a 127, não de 0 a 255. Isso o obriga a ter muito cuidado quando quiser usar as funções de <ctype.h> (você teria de convertê-los para
unsigned char antes de chamar tais funções). Você também poderia ter problemas ao trocar arquivos com máquinas que trabalhem com UTF-8, sendo forçado a usar uma aplicação de conversão.
• Assumir que “todo mundo usa UTF-8” (ou, pelo menos, todo mundo que lhe interessa), e mandar ver com UTF-8 dentro de suas strings com elementos do tipo
char. Mas isso implicaria arcar com o custo de que a quantidade de bytes de uma string não necessariamente vai refletir a quantidade de símbolos que ela representa (por exemplo,
strlen("avião") retornará o valor 6, embora a palavra tenha apenas cinco letras). Além disso isolar um único byte dentro da string não será suficiente para obter o código de um símbolo válido.
• Usar outro tipo de caráter oferecido pela biblioteca do C (e pelo C++ como tipo nativo) chamado
wchar_t (de
wide character, ou
caráter largo, o que significa que ele usa mais bits do que os caracteres tradicionais) e strings formadas por sequências desses caracteres. O tipo
wchar_t costuma ter pelo menos 16 bits (como no Windows) ou mais (no Linux, por exemplo, tem geralmente 32 bits). Ao combinar o uso de
wchar_t e a biblioteca de
locales, que, entre outras coisas, permite converter entre sequências de bytes (
chars) e um ou mais
wchar_ts. Você pode realizar suas computações com caracteres largos de maneira análoga à forma como se trabalhava com os caracteres tradicionais, e usar as funções de conversão de/para bytes a fim de fazer entrada e saída de acordo com o conjunto de caracteres e a codificação especificada pelo sistema operacional.
• Usar bibliotecas de mais alto nível, que abstraiam os detalhes de como um conjunto grande e complexo de símbolos pode ser representado internamente ou comunicado com outros programas ou com usuários finais.
Quanto mais genérico você quiser ser, mais trabalho será necessário, seja esse trabalho feito manualmente por você, seja ele escondido por trás de uma interface aparentemente simples (a qual, por sinal, costuma ser considerada “pesada”, especialmente em comparação com operações puras com
chars e ASCII puro). Mas se você quiser programar a sério com outras línguas que não um Inglês truncado com ASCII puro, eis um assunto que valerá a pena estudar.