Ascii - C++ - Portugal-a-Programar
By saimok, June 21, 2011 in C++
Boas estou a fazer um programa em dev c++ em que preciso de trabalhar com caracteres especiais tais como "ã".
Para todos os outros felizmente a codificação ascii dá pra dar a volta ao contexto de forma a imprimir os caracteres correctos mas para as letras "ã" e "õ" a tabela ascii já não abrange por isso gostava de saber se alguém sabe uma forma de dar uma volta a isto.
Já pensei em usar codificação Unicode mas não consegui encontrar nada que me ajudasse nesse sentido.
Tens que utilizar wide chars (wchar_t*), ou wstring. Esses caracteres utilizam mais do que 1 byte, pelo que têm que ser armazenados num espaço maior de memória, o que implica um tipo diferente.
Podias me dar um exemplo de como usar o wstring?
É que eu tentei usar o wstring em vez de string mas continuo sem conseguir imprimir o "ã" no ecrã
int main(); //Prototizar as funcoes
wxString string2 = wxString::FromAscii("áá");
wcin>>wstr;
wcout<<wstr<<endl;
se quiseres atribuir ou comparar um valor à string tens que usar algo assim do género:
wstr=L"qualquer_coisa";
Ai meu deus. Tanta bacorada neste tópico que nem sei por onde começar.
Antes de tudo convém não confundir o formato de encoding do texto, que pode ser em ASCII, Unicode (variantes UTF-8, UTF-16, UTF-32, etc), ISO-8859-1, com o tipo de dados onde é armazenado.
O standard do C++ também não fala em nenhum lado sobre Unicode, embora o novo C++0x já tenha algum suporte para isso, portanto de momento a utilização de Unicode não é totalmente portável e depende da plataforma que estão a usar.
Não tens de usar wide chars, e até nem é recomendado. O seu tamanho também não é fixo (normalmente 16-bits em Windows e 32-bits em Linux) logo não é portável facilmente.
É possivel guardar texto em UTF-8 em char* e é o que muita gente faz.
Primeiro, não sei porque foste buscar a biblioteca wxWidgets... E mesmo assim o código está completamente errado.
Se leres a documentação:
FromAscii (const char *s) - Converts the string or character from an ASCII, 7-bit form to the native wxString representation.
Ora, como estás a usar um string literal, o seu encoding vai também depender da configuração do compilador e do formato do encoding do ficheiro. Mas independentemente disso, esse literal nunca vai ser ASCII, pois tem caracteres que não existem no ASCII.
Em relação à duvida inicial, infelizmente como disse (ainda) não há forma standard de fazer o que queres.
Recomendo a leitura sobre isto na MSDN, onde está muito bem explicado: Character Sets in C++
Também recomendo a leitura das novidades do novo C++ no que toca a isto: C++ new strings literals
Mas como disseste estás a usar o Dev-C++, que usa o compilador GCC e o ambiente MinGW que provavelmente trabalha de maneira diferente. Eu sei que não te estou a ajudar muito, mas este tópico é um bocado complexo e não há solução fácil de fazer as coisas que não seja perceber os conceitos.
Portanto, o melhor que tens a fazer é ler a documentação do teu compilador, senão podes ter algo que funciona mas nunca vais perceber porquê e o mais certo é dar problemas mais tarde.
Portanto, criticas a minha ideia por não ser portável e depois indicas que não há forma standard de o fazer.
O problema do Unicode é que pode utilizar mais do que 1 byte para representar um char, mas só porque o ASCII propriamente dito apenas utiliza os 7 primeiros bits do byte, permitindo a valores "negativos" (com o bit mais significativo a 1) sejam sinal de que o conjunto com os bytes seguintes é que define um char.
Os charsets comuns apenas utilizam os restantes 128 valores dos 8 bits para definir as letras que são utilizadas em cada linguagem, pelo que existem N tabelas diferentes.
Critiquei o teu post pois tem erros. E embora não haja forma "standard", há formas melhores que outras.
Primeiro falas de forma absoluta a dizer que tem de utilizar wchars, o que é falso. Depois aqueles caracteres não utilizam necessariamente mais do que 1 byte, depende do encoding utilizado. Se for um ISO-8859-1 ocupa apenas 1 byte.
Sim, tens razão em relação à forma como eu disse, mas não era de todo minha intenção dizer que tinha que ser assim. Foi uma resposta rápida, aquele "Tens" é suposto ler-se como "Podes"
Mas em relação à utilização de múltiplos bytes, eu estava a referir-me a Unicode, e não exactamente a um charset que extende a tabela ASCII.