Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Rhaizaos

[Resolvido] Acentos e Caracteres Especiais no C++

Mensagens Recomendadas

Rhaizaos

Boas,

Comecei hoje em C++ e deparei-me com o fato de não conseguir inserir acentos nem "ç", etc.

Estou a utilizar o Dev-C++ 5.5.1.

Gostava que alguém me conseguisse explicar como posso colocar os respetivos caracteres sem obter erros...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rhaizaos

Inserir no programa, ao executar dá erros...

Se por exemplo:

cout << "Multiplicação" << endl;

Ele não me deixa ter o ç e o ~, trocando-os por símbolos ou outras letras/caracteres...

Penso já ter lido algures algo como UTF-8 mas não encontro essa opção em lado nenhum...

Editado por Rhaizaos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

isso é problema da consola e não da linguagem.

posso dizer com 99% de certeza que estas no windows.

terás de esperar por alguém que saiba alterar a fonte da consola do windows (se não houver outra solução) porque eu e windows nunca nos demos muito bem


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rhaizaos

Sim, é fato que estou a utilizar um Windows 8.1

Muito obrigado pela ajuda, esperarei então por alguém que consiga resolver isto...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Greemax

Eu por acaso também não sei como isso se faz, mas podes sempre ir evitando esses caracteres escrevendo tipo "Multiplicacao", é o que costumo fazer visto que não faz grande diferença no funcionamento do programa.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Normalmente também evito os caracteres especiais para não ter problemas (na verdade, actualmente até evito escrever em português :D), por isso nunca tentei resolver esse problema.

No entanto, aqui sugerem uma solução para o problema, usando wide chars e a função _setmode. Pessoalmente continuo a preferir a solução de evitar os caracteres especiais.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nothing Forest

Caso queiras usar o printf (no meu caso uso em "C"), podes fazer:

printf("Multiplica%cao: ", 135);

Isto Utilizando Ascii..

Calculo que vá funcionar..

Caso queiras imprimir um:

Numero Inteiro usas a tag '%d'

Numero real usas a tag '%f'

Caracter usas a tag '%c'

Depois diz, se funcionar.. ;)

Cumps. Nothing :)

Editado por Nothing Forest

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Não é por nada, mas o 135 está fora da tabela ASCII :)

O problema está precisamente no facto de para valores acima do 127, o carácter associado varia de acordo com o encoding. Por isso, tens sempre que ter o cuidado de usar a "tabela" do enconding usado no terminal (no caso do Windows, penso que a função _setmode também permite ajustar o encoding a partir do programa).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

cout << L"Multiplicação" << endl;

No sei se funciona em Windows (que é o que realmente interessa aqui), mas no MacOSX e no Linux, isso imprime lixo (e.g., 0x10937beec). Usando o wcout em vez de cout, passa a imprimir Multiplica??o (pelo li sobre o assunto, penso que é suposto usarmos o wcout nestes casos).

Para referência futura, no Linux (e já agora, no Ideone) o seguinte código funciona:

#include <iostream>
#include <locale>

int main()
{
 std::locale::global(std::locale("en_US.utf8"));
 std::wcout.imbue(std::locale());
 std::wcout << L"Multiplicação" << std::endl;
 return 0;
}

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nothing Forest

Não é por nada, mas o 135 está fora da tabela ASCII :)

O problema está precisamente no facto de para valores acima do 127, o carácter associado varia de acordo com o encoding. Por isso, tens sempre que ter o cuidado de usar a "tabela" do enconding usado no terminal (no caso do Windows, penso que a função _setmode também permite ajustar o encoding a partir do programa).

A serio? :(

Não sabia, a mim funciona perfeitamente, tanto em C como em C++..

Editado por Nothing Forest

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

A serio? :(

Não sabia, a mim funciona perfeitamente, tanto em C como em C++..

num computador que não tenha o SO configurado para PT irás ver que o que pretendes não é apresentado


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nothing Forest

num computador que não tenha o SO configurado para PT irás ver que o que pretendes não é apresentado

Pois não sabia mesmo, tinham-me ensinado assim nas aulas..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rhaizaos

Caso queiras usar o printf (no meu caso uso em "C"), podes fazer:

printf("Multiplica%cao: ", 135);

Isto Utilizando Ascii..

Calculo que vá funcionar..

Caso queiras imprimir um:

Numero Inteiro usas a tag '%d'

Numero real usas a tag '%f'

Caracter usas a tag '%c'

Depois diz, se funcionar.. ;)

Cumps. Nothing :)

Não funcionou :(

cout << L"Multiplicação" << endl;

Dá erro!

Diz: converting to execution character set: Illegal byte sequence

Como eu utilizo a função _setmode e o wide chars?

Editado por Rhaizaos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

aconcelho a nao te importares muito com isso... a consola do windows nao e' a melhor coisa que anda por ai, preocupate com promenores importantes da linguagem.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Já viste a solução para windows do link que te indiquei anteriormente (e que indico novamente em baixo)?

No entanto, aqui sugerem uma solução para o problema, usando wide chars e a função _setmode. Pessoalmente continuo a preferir a solução de evitar os caracteres especiais.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Qualquer operação que seja dependente de configurações de S.O. deveria ser de evitar, pelo menos a este nível de programação.

Pode funcionar no teu PC 5* e deixar de funcionar num outro. Imagina que fazes a apresentação noutro computador e não funciona... Imagina que o teu professor tem um computador com Linux ou um Mac... O programa pode nem correr...

No meu entender ganhas mais em usar os termos em Inglês (não têm acentos logo não tens esses problemas) ou em português sem acentuação nem caracteres especiais. Se indicares ao professor o porquê dessa escolha, até pode ser que ganhes uns pontitos extra...

Existem formas de garantir que isso funciona para todas as plataformas, mas isso implica conhecimentos de compilação condicional, algo que a esse nível não considero recomendável (pode gerar confusão, uma vez que normalmente ainda não têm noções mínimas de como funciona a compilação de um programa).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rhaizaos

Qualquer operação que seja dependente de configurações de S.O. deveria ser de evitar, pelo menos a este nível de programação.

Pode funcionar no teu PC 5* e deixar de funcionar num outro. Imagina que fazes a apresentação noutro computador e não funciona... Imagina que o teu professor tem um computador com Linux ou um Mac... O programa pode nem correr...

No meu entender ganhas mais em usar os termos em Inglês (não têm acentos logo não tens esses problemas) ou em português sem acentuação nem caracteres especiais. Se indicares ao professor o porquê dessa escolha, até pode ser que ganhes uns pontitos extra...

Existem formas de garantir que isso funciona para todas as plataformas, mas isso implica conhecimentos de compilação condicional, algo que a esse nível não considero recomendável (pode gerar confusão, uma vez que normalmente ainda não têm noções mínimas de como funciona a compilação de um programa).

Vou então tentar contornar o problema, obrigado a todos! :thumbsup:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.