Estou tendo problemas com os caracteres dos meus programas em console.
Vamos aos dados técnicos:
Compilador: Dev CPP - Bloodsheed
Linguagem: C++
Então, quando eu escrevo palavras com acentos ou ç, a saída do
programa imprime outra coisa no lugar do caractere. O que eu posso
fazer para que uma saída tipo:
cout << "Conheçe o Mário? Mas que Mário?" << endl;
seja impressa corretamente, com os seus devidos caracteres acentuados?
Depende da codificação default do seu SO, seu código fonte estava salvo em que
codificação? seu SO esta configurado com que codificação?
Acho que um defeito do C++ é não suportar unicode diretamente na linguagem...
existe o wstring, wchar_t, etc... mas mesmo assim eu não tenho como dizer ao
meu compilador que meu código fonte esta escrito em tal codificação e ele
automaticamente construir as strings direito como acontece em outras
linguagem que suportam unicode...
--
Hugo Parente Lima.
"Precisamos de mais gênios humildes no mundo, hoje somos poucos!"
JID: hu...@jabber.org
Sim, eu posso fazer isso, mas minha string tem que estar em ASCII,
caso ela esteja em Chinês por exemplo vai dar pau, e meu código fonte
também precisa estar em ASCII ou qualquer outra codificação que
utilize apenas um byte por caracter, a não ser que haja alguma opção
do compilador para dizer qual a codificação utilizada no código fonte,
sinceramente não pesquisei se essa opção existe ou não =], mas olhando
rapidamente ainda não achei.
Ex.: escrever um Hello World que imprima em wcout alguma palavra com
acento em um arquivo codificado com UTF8, compile e execute e os
acentos sairão loucos, pois em UTF8 os caracteres com acentos que
estão na ISO-8859-1 ocupam 2 bytes ao invés de apenas 1 como em
ISO-8859-1, dai mesmo utilizando o L"", ele coloca cada byte como
sendo um caractere diferente.
--
Hugo Parente Lima
int main ( )
{
const wchar_t * psz = L"ma\xE7\xE3";
::MessageBoxW(0, psz, L"", MB_OK);
const wchar_t * psz2 = L"maçã";
::MessageBoxW(0, psz2, L"", MB_OK);
}
O visual C++ 2005 aceita colocar os caracteres direto no fonte, ele
pode salvar o texto como UTF8. Assim é possível colocar direto
L"maçã" no fonte.
Não sei como é o gcc, mas a opção \x tem que funcionar para
qualquer um.
Acho que todos compiladores deveriam aceitar UTF8.
Então não é possível fazer um programa multiplataforma usando
"funções de console" definidas no C++ padrão.
É possivel usar funções do windows/linux para limpar a tela aonde o
"cout" é mostrado e outras operações.
No windows, você pode direcionar a saída para uma tela sua, por
exemplo como o visual c++ faz com as mensagens de compilação. Neste
caso seria possível usar uma outra fonte e suportar os acentos
inclusive.
Acho que para quem está iniciando deve ser um pouco frustrante essa
realidade :), de não ter como criar um pequeno programa "console"
multiplataforma.
int _tmain(int argc, _TCHAR* argv[])
{
const wchar_t *psz = L"maçã";
std::wcout << psz;
return 0;
}
Compile :)
Depois vá em Menu -> Tools -> Extenal Tools .. Adicione seu exe na
lista e marque "Use output window"
Quando você rodar o programa pelo menu "Tools" ele usa o output do
visual C++ que está usando fonte courier new. O acento vai aparecer
corretamente.
Procurei um pouco e finalmente achei =]
-finput-charset=charset
Set the input character set, used for translation from the character set of
the input file to the source character set used by GCC. If the locale does
not specify, or GCC cannot get this information from the locale, the default
is UTF-8. This can be overridden by either the locale or this command line
option. Currently the command line option takes precedence if there's a
conflict. charset can be any encoding supported by the system's iconv library
routine.
Consegui criar criar código fonte em UTF-8 e ISO-8859-1 e imprimindo
corretamente, inclusive em cout. =] (Meu SO esta usando UTF8)
Um único detalhe... tem que se lembrar de setar o locale no inicio do
programa, se não nada disso via dar certo.
é só chamar:
std::setlocale(LC_ALL, "");
Porém ainda não é impossível criar funções etc com nomes com acentos como em
Java por exemplo, porém eu particularmente desaprovo a criação de variaveis,
classes, etc com acentos... já que isso impossibilita que outras pessoas de
trabalharem no seu código fonte... Imagine você utilizando uma biblioteca
árabe onde o nomedas funções estejam com caracteres árabes... como diachos
você iria digitar aquilo no seu teclado ABNT2?
Continuando... se houver desejo de fazer o programa traduzivel para vários
indiomas é legal dar uma olhada na bilioteca gettext, ela permite que o
tradutor traduza seu programa sem sequer tocar no código fonte =].
--
Hugo Parente Lima.
Concordo.. E se for em chinês mandarim então???? Imagina!!!!
E se for em Grego??? Pior ainda, e se for em Búlgaro ou Russo que
utiliza o afabeto Cirílico?? (Aquele com letras de ponta cabeça,
letras espelhadas....)
Não ia dar certo....
--
Wanderley Caloni Jr
http://www.caloni.com.br
Não sei como as strings são implementadas no kernel, mas acho que devem ser
arrays de caracteres terminadas em zero. Uso UTF8 como codificação padrão
para o sistema (Unicode codificado em UTF8), como em uma string codificada
com UTF8 não existe bytes em zero no meio da cadeia de bytes o kernel
trabalha sem problemas... por conta disso até o nome dos meus arquivos estão
codificados em UTF8, uso o KDE, o KDE tem um ótimo suporte a unicode (herdado
da Qt), por isso não tenho problemas no ambiente gráfico em nenhum programa,
inclusive consigo ver arquivos de tradução escritos com caracteres em russo e
ASCII no mesmo arquivo.
O único problema que tenho aqui é no terminal puro (modo texto), os acentos
aparecem blz, mas não consigo digitar acentos... não sei se é alguma coisa
mal configurada ou sei lá o que... como shell no ambiente gráfico funciona
perfeitamente eu nunca procurei saber a causa do problema.
até aonde eu sei o Unicode é completamente suportado no Linux e em boa
parte das aplicações, suportando os alfabetos cirílicos, asiáticos,
etc. Entretanto, é necessário que a shell utilizada também suporte
(geralmente o Bash, que suporta UTF-8). Nomes de arquivos/diretórios
tem suporte desde que o kernel tenha sido compilado com "NLS UTF-8
Support" (acho que vem habilitado por padrão na maioria das distros).
Todas as versões mais recentes do gnome (baseadas na GTK+ 2.x) quanto
o KDE (QT 3.x) suportam Unicode.
Atenciosamente
--
Otavio R. Piske - AngusYoung
www.angusyoung.org