Ir para conteúdo

POWERED BY:

Arquivado

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

euMesmo2

Problemas com codificação

Recommended Posts

Desenvolvi a seguinte função para substituir os caracteres especiais do html pelos respectivos caracteres em strings:

const int numHTMLSpecialChars = 29;
const char* HTMLSpecialChars[][2] = { { "<", "<" }, { ">", ">" }, {
	"&", "&" }, { "á", "á" }, { "â", "â" }, { "à",
	"à" }, { "ã", "ã" }, { "ç", "ç" }, { "é", "é" }, {
	"ê", "ê" }, { "í", "í" }, { "ó", "ó" }, {
	"ô", "ô" }, { "õ", "õ" }, { "ú", "ú" }, { "ü",
	"ü" }, { "Á", "Á" }, { "Â", "Â" }, { "À", "À" }, {
	"Ã", "Ã" }, { "Ç", "Ç" }, { "É", "É" }, {
	"Ê", "Ê" }, { "Í", "Í" }, { "Ó", "Ó" }, {
	"Ô", "Ô" }, { "Õ", "Õ" }, { "Ú", "Ú" }, { "Ü",
	"Ü" } };

void removeHTMLSpecialChars(char* str) {
char* ptr;
int a;
int dif;
for (a = 0; a < numHTMLSpecialChars; a++) {
	while (1) {
		ptr = strstr(str, HTMLSpecialChars[a][0]);
		if (ptr == NULL) {
			break;
		}
		strcpy(ptr, HTMLSpecialChars[a][1]);
		dif = strlen(HTMLSpecialChars[a][0]);
		if (dif == 0) {
			continue;
		}
		strcpy(ptr + strlen(HTMLSpecialChars[a][1]), ptr + dif);
		printf("%s\n", str); //So p/ testar
	}
}
}

int main(int argc, char* argv[]) {
char teste[80];
strcpy(teste, "áténção");
FILE* file;
removeHTMLSpecialChars(teste);
file = fopen("teste", "a");
fprintf(file, "%s\n", teste);
fclose(file);
}

 

Bom, quando rodo o programa, ele responde:

áténção

áténção

áténção

áténção

Era o esperado, mas no arquivo "teste" a resposta e diferente:

áténção

Creio que o problema seja devido à codificação do arquivo de texto.

Como fazer com que o programa imprima os caracteres corretamente no arquivo de texto?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo resultado aqui na minha máquina, a resposta pode ser o LOCALE do seu ambiente, já que eu vejo e escrevo os acentos numa boa.

Se eu executar o comando locale no meu terminal, todas variáveis estão definidas como pt_BR.utf-8 (inclusive a LANG), menos o LC_ALL.

É windows?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, estou utilizando fedora linux

Quanto ao locale:

$ locale
LANG=pt_BR.utf8
LC_CTYPE="pt_BR.utf8"
LC_NUMERIC="pt_BR.utf8"
LC_TIME="pt_BR.utf8"
LC_COLLATE="pt_BR.utf8"
LC_MONETARY="pt_BR.utf8"
LC_MESSAGES="pt_BR.utf8"
LC_PAPER="pt_BR.utf8"
LC_NAME="pt_BR.utf8"
LC_ADDRESS="pt_BR.utf8"
LC_TELEPHONE="pt_BR.utf8"
LC_MEASUREMENT="pt_BR.utf8"
LC_IDENTIFICATION="pt_BR.utf8"
LC_ALL=

Assim como o seu, pelo visto.

 

Bom, reiniciei o computador e executei o programa novamente. Surpreendentemente, ele retornou o resultado correto tento no terminal, quanto no documento salvo.

Bom, rodei o programa novamente, mas agora com o programa principal, que fazia algumas outras tarefas. Ele editou o arquivo "teste" e , como de costume, cliquei no botão reverter do gedit. Então ele retornou:

Não foi possível reverter o arquivo /home/Yago/teste.

Erro inesperado: Invalid UTF-8 sequence in input

Creio que o problema esteja na codificação das strings que são inseridas no arquivo durante a execução do programa.

Existe algum meio de definir a codificação das strings impressas no arquivo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu não consigo reproduzir o problema, o que dá p/ fazer é pedir p/ você dar uma lida no man 7 utf8. Tem uns pedaços de informação interessantes por lá:

 

 

Users have to select a UTF-8 locale, for example with

 

export LANG=en_GB.UTF-8

 

in order to activate the UTF-8 support in applications.

 

Application software that has to be aware of the used character encoding should always set the locale with for example

 

setlocale(LC_CTYPE, "")

 

and programmers can then test the expression

 

strcmp(nl_langinfo(CODESET), "UTF-8") == 0

 

to determine whether a UTF-8 locale has been selected and whether therefore all plaintext standard input and output, terminal communication,

plaintext file content, filenames and environment variables are encoded in UTF-8.

 

 

http://www.cprogramming.com/tutorial/unicode.html

http://www.gnu.org/s/hello/manual/libc/Representation-of-Strings.html

 

Se alguma dessas coisas funcionar p/ você, dê um toque por aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.