Caracteres acentuados em C++

1. Caracteres acentuados em C++

José Lima
JLima

(usa Ubuntu)

Enviado em 29/10/2012 - 02:23h

Olá a todos!
Tenho estudado C++ usando o Sr Google já a algum tempo porém não consegui resolver o seguinte problema.

Em meu programa de estudos tenho um if com dois ponteiros que são comparados e caso o conteúdo deles forem os mesmos (o caracter "é") será impresso o caracter "é" no loop e assim toda a string ("caracteresAcentuados: \"áéàèüÜç\""), porém não consigo que a rotina execute como pretendido, o máximo que consigo é imprimir: caracteresAcentuados: "". Todos os caractere acentuados desaparecem.

Há alguma solução como o # -*- coding: utf-8 -*- do Python?

Eu experimentei primeiro fazer duas rotinas um pouco semelhantes só para testar se os ponteiros iriam influenciar no resultado, porém não houve qualquer problema.

Ficarei muito grato a quem puder me indicar links, arquivos, tutoriais e explicações aqui no Vol.
Meu inglês é muito pobre. Uso o tradudor do Goolge.

Segue abaixo o meu código.

Grato a Todos!


#include<iostream>
// #include <cctype> Não fez diferença

using namespace std;

int main()
{

const char string[]=
{
"caracteresAcentuados: \"áéàèüÜç\""
};

const char *p_string = string;

cout << "\n\t";

int n = sizeof(string)/sizeof(const char);

for (int i = 0; i < n; i++)
{
//Imprime a string "caracteresAcentuados: \"áéàèüÜç\""
cout << *(string+i) ;
}

cout << "\n\n\t";

for (int j = 0; j < n; j++)
{
//Imprime a string "caracteresAcentuados: \"áéàèüÜç\""
cout << *(p_string+j) ;
}

cout << "\n\n\t";

const char str_e[]= {"é" };

const char *p_str = string;


//Penso que deveria imprimir o
//mesmo que nos exemplos anteriores

while(*p_str != '{TEXTO}') //Obs. Meu caracter de fim de string está sendo alterado para "{TTEXTO}"
//quando eu envio para o Vol. Quem for testar meu código deve fazer
//a devida alteração no while. Não sei resolver isto.
{
if( isprint (*p_str) )
{

if(*p_str == *str_e )
{
cout << "é";

}else
{
cout << *p_str;
}
}

*p_str++;
}

cout << "\n\n";

}




  


2. Re: Caracteres acentuados em C++

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/10/2012 - 09:58h

Internacionalização em C e C++ não é trivial. Vários charsets, várias codificações diferentes para o mesmo charset (especialmente no caso do Unicode), vários idiomas, várias variações dentro do mesmo idioma, caracteres compostos (como "ã") versus combinações de caracteres ("~" combinante + "a"). Uma parte disso suportada em bibliotecas de locales, outra parte em bibliotecas excluivas de charset, outras em bibliotecas exclusivas de idiomas, com algumas dessas partes afetando uma a outra, e outras partes que não se falam ou são conflituosas. Algumas dessas coisas dependerão do charset e do locale usados durante a compilação, outros do charset/locale usados durante a execução.

Em particular, um programa com vistas a internacionalização ou localização não deve usar char e as funções de caracteres de <ctype.h>/<cctype> para caracteres nas strings que possam receber dados não-ASCII, pois essas funções foram pensadas exclusivamente para ASCII. No máximo, você pode usá-las na marra, se garantir que está usando um charset de 8 bits, e com perda de funcionalidade.

Possivelmente você teria de usar wchar_t e <wctype.h> com as funções de conversão da família de mbtowc() (multi-byte to wide char), e verificação de propriedades e afinidades de caracteres via strcoll() e funções relacionadas. Essas coisas podem depender da locale corrente (variáveis de ambiente LANG e LC_*). Funções da libiconv podem ajudar em algumas coisas, como, por exemplo, no caso de você trabalhar com arquivos ou outras fontes de dados externos, e tais fontes poderem ser geradas com diferentes charsets.


3. Re: Caracteres acentuados em C++

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/10/2012 - 23:42h

Faltou dizer que tudo isso varia também não apenas com o sistema operacional, mas também de compilador para compilador.

Para não parecer, porém, que tudo é excessivamente complicado, uma coisa boa que se pode fazer é, depois de entender mais ou menos como as coisas funcionam, parar de reinventar a roda, e usar uma biblioteca que integre todos os recursos, de preferência com uma interface coesa e fácil. Eu não conheço muitas alternativas, mas a que eu conhece, que é a Qt4, tem todos os recursos que eu considero importantes, e uma interface que eu considero bastante coesa e razoável.


4. Re: Caracteres acentuados em C++

José Lima
JLima

(usa Ubuntu)

Enviado em 03/11/2012 - 17:05h

Olá paulo1205! Obrigado por suas respostas.

Pelo que vi de suas respostas e de pesquisas nos links que seguem

https://bitismyth.wordpress.com/2011/03/17/utf-8-wchar_t-ou-outro-formato/

https://bitismyth.wordpress.com/2011/03/17/utf-8-wchar_t-ou-outro-formato/

http://pastebin.com/ezkpdTN0

http://www.orkut.com/Main#CommMsgs?cmm=4684637&tid=5787549602572221789&start=1

http://www.vivaolinux.com.br/script/Utilizando-acentuacao-na-linguagem-C

http://www.unix.com/programming/10594-howto-convert-ascii-utf-8-back-c.html

http://www.cl.cam.ac.uk/~mgk25/unicode.html#c


o meu domínio deste assunto deve demorar um pouco, pois este assunto é muito complexo.

Quanto a utilização de Qt4, eu nem imaginava que a solução deste assunto pudesse estar ligada a uma biblioteca gráfica. Quando eu fiz este programinha acima eu apenas pensava em resolvê-lo com propósito apenas de aprender como se faz. No entanto, seguindo a sua dica eu encontrei neste link http://www.dca.ufrn.br/~rivaldo/Tutorial%20QT4.pdf um tutorial que talvez me ajude a compreensão deste assunto.

Se houver a possibilidade de fazer o código acima funcionar de maneira simples, ou se ficar muito complexo para o fazer, trocá-lo por um código ainda mais simples, eu ficarei muito agradecido com a ajuda.

A quem mais se dispuser a me ajudar ficarei muito grato.


5. Re: Caracteres acentuados em C++

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/11/2012 - 18:52h

Qt não é só uma biblioteca gráfica, mas um framework para desenvolvimento de aplicações multiplataforma.

Se você optar por usar Qt na sua aplicação, a primeira coisa que deve fazer é trocar char por QChar, e a maioria de suas strings devem passar de arrays ou ponteiros para char para QString. Ao longo do programa você pode precisar de QByteArray, especialmente quando estiver convertendo de/para strings nativas por meio de métodos como toAscii(), toLocal8Bit() ou fromUtf8().






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts