Jump to content
Sign in to follow this  
saimok

Ascii

Recommended Posts

saimok

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.

cumprimentos

Share this post


Link to post
Share on other sites
KTachyon

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.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
saimok

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ã

Share this post


Link to post
Share on other sites
SirDave

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ã

#include <wx/string.h>

int main(); //Prototizar as funcoes

int main() {
  wxString string2 = wxString::FromAscii("áá");
}


Be nice to see your eyes, blink them from time to time to relax your retina when using the computer. Blink now!

Share this post


Link to post
Share on other sites
pikax

faz assim

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.

#include<iostream>
#include<string>

using namespace std;

int main()
{
    wstring wstr;

    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";


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
Triton

Ai meu deus. Tanta bacorada neste tópico que nem sei por onde começar. :cheesygrin:


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.

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.

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.

#include <wx/string.h>

int main(); //Prototizar as funcoes

int main() {
  wxString string2 = wxString::FromAscii("áá");
}

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.


<3 life

Share this post


Link to post
Share on other sites
KTachyon

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.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Triton

Portanto, criticas a minha ideia por não ser portável e depois indicas que não há forma standard de o fazer. :)

Critiquei o teu post pois tem erros. E embora não haja forma "standard", há formas melhores que outras.

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.

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.


<3 life

Share this post


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


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

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