Ir ao conteúdo
  • Cadastre-se

C++ Problema com caracteres especiais de uma string


Posts recomendados

boa tarde gente, estou com um probleminha aqui num codigo que estou codando, o que aconte é o seguinte, o ç, caracteres com acento e outros caracteres especiais ocupam dois bytes em uma string, quando eu tento trabalhar com a posição onde esta o ç... na string me retorna coisas estranhas e não o ç... exemplo:

string str = "açucar";
cout << str[0] << endl; //saida a
cout << str[1] << endl; //erro
cout << str[2] << endl; //erro
cout << str[3] << endl; //saida u

decidi colocar o byte 1 e  2 dentro de um arquivo de texto e depois ler o conteudo do arquivo, o resultado foi o ç codigo:

string str = "açucar"; 
	fstream arqq;
	arqq.open("temp",ios::out);
	arqq << str[1] << str[2] ;
	arqq.close();
	string caracter;
	arqq.open("temp",ios::in);
		if(arqq.is_open()){		
			string linha;
			caracter = "";//zera global
			while(getline(arqq,linha)){
				//cout << linha << endl;
				caracter+=linha;
				}
				arqq.close();
	}
	cout << ">" << caracter << "<" << endl;

dai coloquei dentro do arquivo somente o byte 1, o mesmo codigo de cima só mudei a linha arqq << str[1] << str[2]; para arqq << str[1]; , com isso feito o resultado não é o ç e um interrogação bugado, mas dentro do arquivo abrindo o arquivo "temp" pelo gedit ele mostra \C3 e mostra um erro de codificação dai eu mudo para Ocidental ISO 8859-1 e me mostra isso à quando abro o arquivo com o geany me mostra à isso logo de cara nem pede pra mudar codificação e quando eu faço esse procedimento com o byte 2 acontece o mesmo mas com os caracteres \A7 §

o que eu quero e que quando inserir o byte 1 no arquivo insira \C3 e quando ler o arquivo não mostre um interrogação bugadom, quero que mostre \C3, com isso poderei fazer uma comparação assim ó

if(caracter=="\C3"){
	cout << "sucesso" << endl;
}

mas ta difícil de fazer isso, é como se o if não conseguisse interpretar \C3 ou o fstream nao consegue ler somente \C3, alguem consegue me ajudar com isso?

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

seria possivel mandar o código completo?

 

adicionado 0 minutos depois

info sobre sistema operativo, codificação do console e IDE usado

adicionado 18 minutos depois

você está enganado. O tamaño do caractere ç é de 1 byte... pelo menos é o que pude observar no pedaço que você postou.

Seu problema é de codificação certamente, ou para ser mais claro "do prompt". Da uma olhada aqui onde respondi isso e talvez te ajude.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@vangodp

SO: Debian 9 stretch

IDE: Geany

 

fiz o que você disse mudei a codificação do terminal para 1252, 

não mostra mais o interrogação bugado, mostra o à no primeiro byte do ç e no segundo mostra §

o problema é que o ç ocupa duas posições em uma string e esse esta sendo o problema porque preciso passar caracter por caracter de uma string e manipular esse caracter, mas não funciona porque ao contar quantos caracter há na string mostra 1 a mais q no caso é o ç que ocupa dois espaços fiz testes sem ç e o tamanho da string é real, ou seja o problema esta em armazenar ç... em uma string o ç ocupa duas posições na string a posição 1 Ã e a posição 2 

//DESSA MANEIRA O Ç É MOSTRADO PERFEITAMENTE
string str = "açucar";
int nc = strlen(str.c_str());
cout << nc;
for(int a=0;a<nc;a++){
    cout << str[a];
}

//DESSA MANEIRA MOSTRA Ã E §
string str = "açucar";
int nc = strlen(str.c_str());
cout << nc;
for(int a=0;a<nc;a++){
    cout << str[a] << endl;//apenas acrescentei o endl
}

//note que no o tamanho da string é 7 pois o ç ocupa dois espaços na string
//se escrever acucar o tamanho passa a ser 6

 

adicionado 31 minutos depois

acabei de resolver, o problema é que o geany(ide) salva meu arquivo com codificação utf-8 eu mudei a codificação do documento pelo geany para windows 1252 ocidental, e esta funcionando perfeitamente, o ç esta ocupando apenas um espaço na string, valeu pela ajuda @vangodp

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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