Como faço pra um char armazenar o caractere 'ã'? [RESOLVIDO]

1. Como faço pra um char armazenar o caractere 'ã'? [RESOLVIDO]

Carlos Vinícius
CarlosVinicius

(usa Debian)

Enviado em 10/03/2018 - 01:39h

Como armazeno 'ã' no char1?
#include <stdio.h>
int main()

{
char char1 = 'ã';
printf("Avião\n");
printf("%c\n",char1);
}


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 conversinha [-Woverflow]


Saída do bash:
Avião
Caractere losangulo



  


2. Re: Como faço pra um char armazenar o caractere 'ã'? [RESOLVIDO]

Fernando
phoemur

(usa Slackware)

Enviado em 13/03/2018 - 14:10h

Um caractere Unicode (UTF-8) pode necessitar de 1 a 4 bytes para ser representado adequadamente, de forma que um char pode não dar conta de armazenar e dar overflow.
Isso é a razão dos warnings que você recebeu, apesar de ter compilado e rodado o programa...

talvez você precise usar um wchar_t, porém é um pouco mais complicado:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main()

{
setlocale(LC_ALL, "en_US.UTF-8");
wchar_t wc = L'ã';
wprintf(L"%lc\n", wc);
wprintf(L"%ls\n", L"Avião");
}





3. Re: Como faço pra um char armazenar o caractere 'ã'? [RESOLVIDO]

Carlos Vinícius
CarlosVinicius

(usa Debian)

Enviado em 13/03/2018 - 23:47h

O Obrigado resolveu, mas não entendi nada.
então dane-se, estudo outra hora.


4. Re: Como faço pra um char armazenar o caractere 'ã'? [RESOLVIDO]

Paulo
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.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts