Ir ao conteúdo
  • Cadastre-se

Bug na tabela ASCII!!!


ChicoLiebl

Posts recomendados

Esse é meu primeiro post nesse forum e espero estar postando no lugar certo.

Meu problema é o seguinte. Eu estava testando os caracteres da tabela ASCII em C/C++ e logo vi que não estava funcionando criei um programa para exibir o código em ASCII do caractere e todos os caracteres da tabela ASCII estendida não estão funcionando,

por exemplo se eu digitar 'ç' o código sai como -121 o que deveria ser 135.

já procurei bastante mas não encontrei a solução. Uso windows 7 e o Dev C++ como compilador.

Espero que possam me ajudar.

Segue o código do programa.


#include <iostream.h>
#include <cstdlib>
#include <conio.h>
int main ()
{
char c;
c=getch();
printf ("%d\n", c);
system ("pause");
return 0;
}

Agradeço desde já.

Link para o comentário
Compartilhar em outros sites

Esse é meu primeiro post nesse forum e espero estar postando no lugar certo.

Meu problema é o seguinte. Eu estava testando os caracteres da tabela ASCII em C/C++ e logo vi que não estava funcionando criei um programa para exibir o código em ASCII do caractere e todos os caracteres da tabela ASCII estendida não estão funcionando,

por exemplo se eu digitar 'ç' o código sai como -121 o que deveria ser 135.

já procurei bastante mas não encontrei a solução. Uso windows 7 e o Dev C++ como compilador.

Espero que possam me ajudar.

Segue o código do programa.


#include <iostream.h>
#include <cstdlib>
#include <conio.h>
int main ()
{
char c;
c=getch();
printf ("%d\n", c);
system ("pause");
return 0;
}

Agradeço desde já.

Você deve usar unsigned char e não char, pois se quer valores acima de 126 deve dizer para o compilador considerar o ultimo bit como "utilizavel", que seria o de sinal.Exemplo: você tem 1 1 1 1 1 1 1 1 = 8 bits para um char, mas o ultimo é o bit de sinal então você tem uma faixa de -127 a 127 = 255. Tenta com unsigned char e de um retorno se funcionol.

Link para o comentário
Compartilhar em outros sites

Você deve usar unsigned char e não char, pois se quer valores acima de 126 deve dizer para o compilador considerar o ultimo bit como "utilizavel", que seria o de sinal.Exemplo: você tem 1 1 1 1 1 1 1 1 = 8 bits para um char, mas o ultimo é o bit de sinal então você tem uma faixa de -127 a 127 = 255. Tenta com unsigned char e de um retorno se funcionol.

Realmente funcionou no programa que postei acima, porém quando uso desta forma:


#include <iostream>
unsigned char a=135;
int main()
{
printf("%c \n", a);
system("pause");
return 0;
}

O programa retorna um caractere diferente(O simbolo matematio que significa pertence).

Ou quando abro o CMD(Pronpt de Comando) todos os caracteres com acento estão errados. Creio que o problema esteja em meu sistema mesmo.

Mesmo assim Obrigado.

Espero que possa me ajudar.

Link para o comentário
Compartilhar em outros sites

Realmente funcionou no programa que postei acima, porém quando uso desta forma:


#include <iostream>
unsigned char a=135;
int main()
{
printf("%c \n", a);
system("pause");
return 0;
}

O programa retorna um caractere diferente(O simbolo matematio que significa pertence).

Ou quando abro o CMD(Pronpt de Comando) todos os caracteres com acento estão errados. Creio que o problema esteja em meu sistema mesmo.

Mesmo assim Obrigado.

Espero que possa me ajudar.

Você deve atentar para uma coisa. Caracteres de formatação não são imprimiveis,e em um terminal não serão exibidos caracteres especiais como os da parte extendida da tabela, se você quiser realmente fazer uma boa verificação sugiro q abra um arquivo e imprima de 0 a 255 em formato char e abra com um bom editor de texto tipo Notepad++, é aí você conseguirá visualiza-los. Pode fazer uma coisa bem basica assim:

#include <stdio.h>

void main()

{

FILE *saida;

int i;

saida=fopen("ASCII.txt","wb");

for(i=0;i<256;++i)

fwrite(&i,sizeof(char),1,saida);

fclose(saida);

}

Link para o comentário
Compartilhar em outros sites

Você deve atentar para uma coisa. Caracteres de formatação não são imprimiveis,e em um terminal não serão exibidos caracteres especiais como os da parte extendida da tabela, se você quiser realmente fazer uma boa verificação sugiro q abra um arquivo e imprima de 0 a 255 em formato char e abra com um bom editor de texto tipo Notepad++, é aí você conseguirá visualiza-los. Pode fazer uma coisa bem basica assim:

#include <stdio.h>

void main()

{

FILE *saida;

int i;

saida=fopen("ASCII.txt","wb");

for(i=0;i<256;++i)

fwrite(&i,sizeof(char),1,saida);

fclose(saida);

}

Executei o programa e abri o arquivo gerado com o notepad++ e tive a seguinte saida:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ*¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

Aparentemente não esta correto, fiz alguns testes e percebi que o caractere 'ç' que devia estar na posição 135 esta na 231.

Gostaria de poder deixar a minha tabela igual a padrão já que isso impossibilita o uso da biblioteca <locale.h>.

Espero que possam me ajudar.

Obrigado.

Link para o comentário
Compartilhar em outros sites

Executei o programa e abri o arquivo gerado com o notepad++ e tive a seguinte saida:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ*¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

Aparentemente não esta correto, fiz alguns testes e percebi que o caractere 'ç' que devia estar na posição 135 esta na 231.

Gostaria de poder deixar a minha tabela igual a padrão já que isso impossibilita o uso da biblioteca <locale.h>.

Espero que possam me ajudar.

Obrigado.

Vamos a explicação disto. Primeiro entenda que a tabela ASC2, que é base de outras codificações modernas como UTF-8, usa somente 7 bits sendo o de 0 a 126 em decimal, representado por 8 bits(1 byte) sendo o ultimo bit (esq para dir) o bit de paridade utilizado para detectar erros. O que você quer é a parte que chamamos de extendida, e esta não tem um padrão comum e fortememente dependente da arquitetura. Por que você está visualizando os caracteres que citou de "forma errada"? Não é que está errada sua forma ou sequência, é que provavelmente sua arquitetura está usando a ISO 8859-1 ou Latin1 (que é comum mas não padrão) que é usada para representar o alfabeto latino, já que a ASC é padrão do alfabeto inglês e por isso não possui as acentuações que o latino possui, e usa para representar seus caracteres a parte extendida (128-255). Consulte a ISO que citei e verá que está na ordem referente a ela.Em DOS é mais comum a ISO8859 mais no linux o mais comum é UTF-8

Link para o comentário
Compartilhar em outros sites

Vamos a explicação disto. Primeiro entenda que a tabela ASC2, que é base de outras codificações modernas como UTF-8, usa somente 7 bits sendo o de 0 a 126 em decimal, representado por 8 bits(1 byte) sendo o ultimo bit (esq para dir) o bit de paridade utilizado para detectar erros. O que você quer é a parte que chamamos de extendida, e esta não tem um padrão comum e fortememente dependente da arquitetura. Por que você está visualizando os caracteres que citou de "forma errada"? Não é que está errada sua forma ou sequência, é que provavelmente sua arquitetura está usando a ISO 8859-1 ou Latin1 (que é comum mas não padrão) que é usada para representar o alfabeto latino, já que a ASC é padrão do alfabeto inglês e por isso não possui as acentuações que o latino possui, e usa para representar seus caracteres a parte extendida (128-255). Consulte a ISO que citei e verá que está na ordem referente a ela.Em DOS é mais comum a ISO8859 mais no linux o mais comum é UTF-8

Realmente quando consultei uma tabela ASCII ISO 8859-1 percebi que minha tabela não esta errada só é diferente.

Mas gostaria de saber se é Possível mudar isso, já que gostaria de usar a biblioteca <locale.h>.

Tem alguma maneira de mudar ISO 8859-1 para UTF-8?

Link para o comentário
Compartilhar em outros sites

Realmente quando consultei uma tabela ASCII ISO 8859-1 percebi que minha tabela não esta errada só é diferente.

Mas gostaria de saber se é Possível mudar isso, já que gostaria de usar a biblioteca <locale.h>.

Tem alguma maneira de mudar ISO 8859-1 para UTF-8?

Olha, não conheço muito a locale.h mas sei que existe a funçao setlocale() que recebe 2 parametros, e você pode ajustar o segundo como um string vazio ("") para usar o local padrão definido no ambiente.Locale padrão do sistema (que é especificado por uma string vazia : ""). É a configuração de idioma fornecido pelo ambiente onde a aplicação está em execução.

Link para o comentário
Compartilhar em outros sites

Olha, não conheço muito a locale.h mas sei que existe a funçao setlocale() que recebe 2 parametros, e você pode ajustar o segundo como um string vazio ("") para usar o local padrão definido no ambiente.Locale padrão do sistema (que é especificado por uma string vazia : ""). É a configuração de idioma fornecido pelo ambiente onde a aplicação está em execução.

Aparentemente existe uma maneira de usar locale() em ISO 8859-1 caso não de certo posso simplesmente substituir os acentos por caracteres agora que tenho uma tabela ASCII que é "compatível" com o meu sistema.

Muito obrigado pela ajuda!

Link para o comentário
Compartilhar em outros sites

Aparentemente existe uma maneira de usar locale() em ISO 8859-1 caso não de certo posso simplesmente substituir os acentos por caracteres agora que tenho uma tabela ASCII que é "compatível" com o meu sistema.

Muito obrigado pela ajuda!

beleza. Então marque como resolvido para que possa ser util para outras pessoas.E se precisar estamos ái.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...