Ir ao conteúdo
  • Cadastre-se

C fopen: leitura de txt salvo em iso-8859-1


codigo rapido
Ir à solução Resolvido por arfneto,

Posts recomendados

Olá pessoal!

O problema parece simples, mas não sei resolver...
tenho o seguinte programa que tenta abrir o aquivo file.txt, mas o arquivo foi salvo no formato  iso-8859-1:
 

#include <stdio.h>
#include <stdlib.h>
int main () 
{
	FILE *fp;
	int c;  
	fp = fopen("file.txt","r");
	while(1) 
	{
		c = fgetc(fp);
		if( feof(fp) ) 
		{ 
			break ;
		}
		printf("%c", c);
	}
	fclose(fp);   
	return(0);
}


Então o que acontece é que ele mostra o conteudo do arquivo, mas não aparecem os caracteres que quero. Aparece '?'... (Feio)... Não é o que esperava.

Eis aqui o conteudo do arquivo. Só uma linha:

ágata @  2012

Como devo fazer para que os caracteres aparecam como o conteudo do arquivo?

 

c1.png

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

rode locale no terminal e veja a saída. 

 

    locale

 

Algo assim seria  o esperado

 

LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=

 

Em utf-8 teria os acentos. Ou parte deles. Isso é um inferno. E como não há "encoding" gravado no arquivo, no máximo o tal BOM para saber como ler Unicode, quando não foi você que gerou o arquivo ou quando você não sabe onde vão rodar esse programa... a sorte está lançada.

 

Para ler seus próprios arquivos confirme o locale que sua sessão usa, ou mude no próprio programa com setlocale() de locale.h

 

Sobre o título.. "fopen: leitura de txt salvo em iso-8859-1" como eu disse isso não existe. Só existe salvar. Salvar como texto seria possível se existisse algo como em HTML <meta charset="UTF-8">. Mas não existe.

 

Como eu disse, o único recurso que existe é o BOM, Byte Order Mark, para saber com qual endianness o texto foi gerado. Daí pra frente são apenas bytes. E Unicode tem mais de 150.000 símbolos (e crescendo). Multi-byte quer dizer exatamente isso: até 4 bytes cada "letra". Fuja disso a menos que seja bem pago.

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

6 horas atrás, arfneto disse:

Sobre o título.. "fopen: leitura de txt salvo em iso-8859-1" como eu disse isso não existe. Só existe salvar. Salvar como texto seria possível se existisse algo como em HTML <meta charset="UTF-8">. Mas não existe.


Até no tempo em que eu usava Windows eu tinha essas opções de formato de salvamento. Quem ler o titulo vai entender. Ou seja, já sabe que existe diferenças de como os bytes dos caracteres são salvos dependendo da opção que escolher salvar o texto.

Salvar é genérico. Mas como salvar é opcional. Tá ai a foto pra provar que existe sim:

 

Captura de tela de 2021-08-15 04-52-18.png

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>

int main()
{
	char a;
	int i;

	a = 'Á';
	printf("Á = %i\n", (int)a);
	a = 'A';
	printf("A = %i\n\n", (int)a);


	i = -127;
	printf("-127 = %c\n", (char)i);
	printf("-63 = %c\n", (char)-63);
	printf("hexadecimal C1 ou decimal %i devia ser = Á, mas é %c\n", 16*12+1, (char)(16*12+1));
	i = 65;
	printf("65 = %c\n\n", (char)i);
 
	return 0;
}

 

na minha tela:

513680899_Capturadetelade2021-08-1505-31-32.thumb.png.ab987783c797686fc986f2033852114d.png

9 horas atrás, arfneto disse:

Para ler seus próprios arquivos confirme o locale que sua sessão usa, ou mude no próprio programa com setlocale() de locale.h


Agora isso sim é relevante. Não funcionou, mas é util. Assim como o comando

locale -a

 

Eu já decidi que vou fazer meu proprio encode e decode pra resolver o problema que to tendo. Não posso contar que o cliente ja tenha isso ou não isso na maquina dele.

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

Em 15/08/2021 às 05:27, codigo rápido disse:

Até no tempo em que eu usava Windows eu tinha essas opções de formato de salvamento. Quem ler o titulo vai entender. Ou seja, já sabe que existe diferenças de como os bytes dos caracteres são salvos dependendo da opção que escolher salvar o texto.

Salvar é genérico. Mas como salvar é opcional. Tá ai a foto pra provar que existe sim

Ainda é tempo de usar Windows. Ou qualquer outro sistema, mas você só está considerando uma parte da história e por isso seus acentos não saem na tela.

 

@codigo rápidoSua foto mostra o que já expliquei e não o que você está dizendo.

 

Entenda: de nada adianta você salvar como qualquer coisa, em Windows, Unix  e derivados ou qualquer coisa, se DENTRO do arquivo não vai nada exceto talvez os dois bytes do BOM. Nada.

 

Na hora em que abrir o texto, lá dentro não está escrito que diabo é o encoding do texto, como tem em HTML ou num header de e-mail. E pode ser que nem o autor se lembre de como salvou o arquivo. Salvar como não adianta nada no minuto seguinte. Você manda esse arquivo texto para uma máquina configurada para locale em russo e abre no editor e o sistema não vai saber que aquilo voi salvo em qualquer formato...

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

9 horas atrás, arfneto disse:

Na hora em que abrir o texto, lá dentro não está escrito que diabo é o encoding do texto,

Sim e nem vai estar porque é arquivo txt. Cada um em sua lingua escreve da melhor forma que lhe agrada.

 

9 horas atrás, arfneto disse:

Você manda esse arquivo texto para uma máquina configurada para locale em russo e abre no editor e o sistema não vai saber que aquilo voi salvo em qualquer formato

Ou seja... Lá o alfabeto cirilico não é suportado pela iso-8859-1, que é opção de quem? de tem esse encoding? Não é?

você só precisava corrigir uma coisa que escrevi errado:
A palavra que usei não deveria ser 'formado' e sim 'encoding'. Mas eu não coloquei isso no titulo.

Valeu pelo locale! me fez perceber que eu só tenho aqui na minha maquina utf-8 instalado, o que pra mim é estranho já que o meu gedit está salvando em 3 encodings diferentes incluindo o Latin1. O que me deu a ideia de criar um encode e decode pra garantir que eu só preciso instalar o meu programa no cliente e mais nada.

Link para o comentário
Compartilhar em outros sites

  • Solução
1 hora atrás, codigo rápido disse:

Sim e nem vai estar porque é arquivo txt. Cada um em sua lingua escreve da melhor forma que lhe agrada

Nada existe em um arquivo txt que fale sobre língua ou forma de escrever. Não há como escrever um encode/decode a menos que seja para você mesmo para os seus próprios arquivos a partir do momento em que escreveu isso.

 

1 hora atrás, codigo rápido disse:

que eu só tenho aqui na minha maquina utf-8 instalado, o que pra mim é estranho já que o meu gedit está salvando em 3 encodings diferentes incluindo o Latin1. O que me deu a ideia de criar um encode e decode pra garantir que eu só preciso instalar o meu programa no cliente e mais nada


Não funciona assim. A menos que insira algo nos seus arquivos para marcar isso e estará reinventando a roda, ou criando uma só para você usar

1 hora atrás, codigo rápido disse:

Ou seja... Lá o alfabeto cirilico não é suportado pela iso-8859-1, que é opção de quem? de tem esse encoding? Não é?

 

O encoding não vai no texto. No máximo o BOM. 2 bytes. 

 

Exemplo

Um arquivo de 1 linha
 

Assim é. O conteúdo é uma coleção de bytes

 

Em um computador comum novo...

 

image.png.933bd8f0db5752f71d4612f16bd897a8.png

 

Onde pode ver o BOM no início do arquivo. No Linux e no MacOS é igual.

 

od -x é o que se chama dump na terminologia Unix, dos anos 70 --- o o é de octal, por causa das máquinas da DEC daquela época. E a seguir está o conteúdo total desse arquivo, em hexadecimal.

 

Dependendo do locale o type, equivalente ao cat do Unix, vai mostrar o conteúdo de um certo modo. No Windows tem esse conceito de codepage, anos 80. 1252 é a página para caracteres latinos, e é diferente da padrão 850. E o texto é interpretado de outro modo. E se usar a codepage 65001, Unicode, anos 90 criado pelo criador do Unix junto com Robert Pike Pike, o criador do Go.

 

Entenda que dentro do arquivo não tem nada exceto o byte order mark --- porque Unicode pode ter até 4 bytes e little/big endian faz diferença --- se entende o que é isso.

 

Isso é o que estou tentando te explicar. Dentro do texto não há lugar para isso (encoding). Mesmo o BOM pode e vai dar problemas em programas de iniciantes --- não sei se é seu caso --- porque pode ser lido como conteúdo já que está mesmo lá.

 

Em XML ou HTML tem um header, um namespace, um cabeçalho, alternativas para colocar essa definição.

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

34 minutos atrás, arfneto disse:

Nada existe em um arquivo txt que fale sobre língua ou forma de escrever.

Quem tá aprendendo computação, no primeiro ano da faculdade, já é ensinado que metodo não retorna valor e que função retorna valor. Isso é ensinado e dado como senso independente de linguagem. Se no c tem sua particularidade, isso são outros 500.

 

34 minutos atrás, arfneto disse:

O encoding não vai no texto. No máximo o BOM. 2 bytes. 

sim. correto. o que mostra que foi salvo por um programa que permite a escolha do encoding.

Link para o comentário
Compartilhar em outros sites

31 minutos atrás, codigo rápido disse:

Quem tá aprendendo computação, no primeiro ano da faculdade, já é ensinado que metodo não retorna valor e que função retorna valor. Isso é ensinado e dado como senso independente de linguagem. Se no c tem sua particularidade, isso são outros 500.

Tem mesmo alguma referência disso? Que escola seria essa? Qual seria o livro texto? Como te expliquei isso vem do Pascal, nos anos 70, a linguagem que o prof. Dijkstra criou com essa ideia de ensinar a programar direito e tinha de fato Procedure e Function. E isso foi mantido no Visual Basic nos 80.  Não existe em java, em Python, nas linguagens desse forum e não me lembro de ter visto isso em outras linguagens, e conheço algumas.

 

A menos que a referência dessa faculdade seja o Pascal User Manual And Report, não sei de onde tiraram essa coisa de procedure e function...

Link para o comentário
Compartilhar em outros sites

Em 15/08/2021 às 22:04, arfneto disse:

Tem mesmo alguma referência disso? Que escola seria essa? Qual seria o livro texto? Como te expliquei isso vem do Pascal, nos anos 70, a linguagem que o prof. Dijkstra criou com essa ideia de ensinar a programar direito e tinha de fato Procedure e Function. E isso foi mantido no Visual Basic nos 80.  Não existe em java, em Python, nas linguagens desse forum e não me lembro de ter visto isso em outras linguagens, e conheço algumas.

 

A menos que a referência dessa faculdade seja o Pascal User Manual And Report, não sei de onde tiraram essa coisa de procedure e function...

Não contribui em nada essa discussão.

isso é ensinado no primeiro ano das faculdades em Algoritmos e Programação I. O ano foi 2004 Floriapólis, UNISUL campos pedra branca. E isso era ensinado assim justamente para os novatos. Agora se não usam mais essa definição, eu lamento.

Link para o comentário
Compartilhar em outros sites

Em 15/08/2021 às 22:26, codigo rápido disse:

isso é ensinado no primeiro ano das faculdades em Algoritmos e Programação I. O ano foi 2004 Floriapólis, UNISUL campos pedra branca. E isso era ensinado assim justamente para os novatos

Entendo.

 

Minha teoria é de que o instrutor em questão começou a carreira acadêmica no Brasil no início dos anos '80. E na época as linguagens dominantes historicamente eram FORTRAN para o mundo científico, COBOL para os negócios e Assembler para qualquer coisa. Unix era novidade. C era novidade e acho que nem haviam muitos compiladores no país.

 

Algumas universidades começavam a usar Pascal nos cursos de introdução à programação. Era algo novo, a linguagem da moda, que o Prof. Niklaus Wirth havia criado anos antes exatamente com esse objetivo.

 

E esse instrutor estudou em alguma dessas escolas e aprendeu essa coisa de Procedure e Function e passou adiante.

 

No fundo Pascal é bem mais adequada para esse fim do que seria C ou FORTAN ou COBOL. Hoje se usa Python porque é interpretada e pode ser interativa e ensinada em pouco tempo. Bem menos do que o preciso para aprender Pascal, Ou C.

 

E Pascal teve grande sucesso na época, em especial no meio da década onde a história diz que a Borland vendeu milhares e milhares de cópias do Turbo Pascal, o avô dos IDE como conhecemos hoje. E o Pascal levou ao Delphi --- já na época de mouses e monitores CGA --- e de grande alcance até hoje com a ideia dos VCL, a biblioteca de componentes e o editor visual para alinhar as telas e ajustar os botões e painéís no Windows com uns poucos cliques versus a aventura que era fazer isso em C no final dos 80.

 

E o criador disso é o mesmo criador do C#  e arquiteto do .Net. Mundo pequeno. 

 

Sub

 

Veja a outra herança dessa época, direto de da Microsoft, da documentação do Visual Basic em 2021

https://docs.microsoft.com/pt-br/dotnet/visual-basic/programming-guide/language-features/procedures/

 

End Sub

 

image.png.f9184a07fe2202aa986f1e5abd8c43b3.png

 

Longa vida às procedures e funções. :D 

Link para o comentário
Compartilhar em outros sites

A seriedade de uma faculfade está na capacidade de montar banca examinadora. E essa faculdade tem. Eu já estudei em um monte de lugar, foi a que melhor apresentou conhecimento e preparo.

Eu agradeço aos outros apontamentos (VB, como as subs e etc) são realmente instrutivos.

Quanto ao ensino para iniciantes, acho excelente o inicio da diferenciação de método e função ser como a apresentada, conforme o senhor mesmo disse "Dijkstra ?", pois é a primeira coisa que o aprendiz ve. Ele não vai relacionar de imadiato muita coisa. Nem eu me importo com isso e nem vou me importar porque pra mim o que importa é entender as expressões da linguagem. E para o caso, como tudo antes faço do portugol, a forma de representar a chamada de metodos que conheço em c é mais ou menos assim:

var = function(com parametro ou sem parametro); // variavel recebe valor como resultado da chamada de uma função
ou simplesmente
function(com parametro ou sem parametro); // Não tem variavel. É apenas o método sendo executado. 
É, para iniciantes do portugol, chamada de método. É a partir disso que você elabora soluções para cada linguagem.

Novamente agradeço ao conteudo instrutivo.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!