Jump to content
Rhaizaos

[Resolvido] Acentos e Caracteres Especiais no C++

Recommended Posts

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

Share this post


Link to post
Share on other 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...

Edited by Rhaizaos

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 :)

Edited by Nothing Forest

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other 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;
}

  • Vote 1

Share this post


Link to post
Share on other 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++..

Edited by Nothing Forest

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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..

Share this post


Link to post
Share on other 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?

Edited by Rhaizaos

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other sites
s0m30n3

Cheguei atrasado 😕
 

#include <iostream>
#include <locale>

int main()
{
    std::cout << "Olá!"; 
}

EDIT: demasiado atrasado, só depois de postar é que reparei que isto foi em 2013 -_-

Edited by s0m30n3

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.