Como posso identificar a codificação do arquivo?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Como posso identificar a codificação do arquivo?

Mensagem por lugab »

Ronaldo, esse tpc trata de mais de um assunto, então, me diz, p.fv, pra q serve essa função..

Código: Selecionar todos

hb_cdpIsUTF8( Memoread( cFile ) )
Não tenho tanto conhecimento assim, pra identificar o q ela faz pelo título...
lugab
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Como posso identificar a codificação do arquivo?

Mensagem por Imatech »

Olá Gabriel !


Não fiz nenhum teste, mas acredito que tambem funcione para identificar arquivos que foram salvos como formato unicode...


O real objetivo da função é informar ao Harbour se determinado código de páginação esta no formato UTF8



Sucesso...
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como posso identificar a codificação do arquivo?

Mensagem por Jairo Maia »

Olá Ronaldo,

Para registro,

Tentei usar a função Hb_cdpIsUTF8( cString ) com a finalidade de identificar o formato da string, mas não dá certo. A finalidade dela é exclusivamente informar o Harbour no ponto que ela for chamada (True ou False), se o Harbour está com codificação UTF-8.

Sua sintaxe é

Código: Selecionar todos

Hb_cdpIsUTF8( cCodePageID )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Como posso identificar a codificação do arquivo?

Mensagem por Imatech »

Olá Jairo !

Agradecido pelos testes e informação... :)Pos

Conclusão: Hb_cdpIsUTF8(...) não serve para identificar códificação de arquivos texto ( .txt, .prn, etc )

Sucesso...
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como posso identificar a codificação do arquivo?

Mensagem por Jairo Maia »

Olá Pablo,
Pablo César - Em 27 Out 2012 escreveu:Entendi nada ! Nem da causa do seu riso nem a explicação.
Com toda Razão! Somente no domingo percebi quanta "bobagem" falei, e que quem não tinha entendido a mensagem era eu. Fiz tamanha confusão, que nem de lapso posso chamar, acho que foi uma parada cardíaca mesmo. Não atentei naquele momento o que você dizia. Como não tem emoticon de alguém enfiando uma lata de lixo na cabeça, vai este mesmo:
:%

Mas voltando ao assunto, comecei a tentar encontrar algum critério que pudesse diferenciar os formatos do texto, e acabei chegando numa situação que "aparentemente" parece que funciona, mas obviamente ainda requer mais testes. Com testes que fiz com vários textos funcionou. Veja:
Clipboard.jpg
Note que o último bloco nega todas as codificações, isto deve ser compreendido que o texto checado não continha caracteres especiais.

Usando seu exemplo, montei esta situação com HMG 3.0.44, Se desejar fazer alguns testes, o código está abaixo:

Código: Selecionar todos

#include <hmg.ch>

REQUEST HB_CODEPAGE_PTISO
REQUEST HB_CODEPAGE_PT850

Function Main()
Local aText:={}, cMsg:="", i //, crlf:=Chr( 13) + Chr( 10 )

SET LANGUAGE TO PORTUGUESE
SET CODEPAGE TO PORTUGUESE

Aadd(aText,"ANSI - Relatório de comissões no mês de [?]")
Aadd(aText,"OEM - Relat¢rio de comissäes no mˆs de [?]")
Aadd(aText,"UTF-8 - Relatório de comissΣes no mês de [?]")
Aadd(aText,"FREE - Relatorio de comissoes no mes de [?]")

For i=1 to 4

    If IsAnsi(aText[i])
       cMsg:=cMsg+"É ANSI: "+aText[i]+CRLF
    Else
      cMsg:=cMsg+"NÃO é ANSI: "+aText[i]+CRLF
    Endif
    
   If IsOem(aText[i])
       cMsg:=cMsg+"É OEM: "+aText[i]+CRLF
   Else
      cMsg:=cMsg+"NÃO é OEM: "+aText[i]+CRLF
    Endif
   
    If IsUtf8(aText[i])
       cMsg:=cMsg+"É UTF-8: "+aText[i]+CRLF
   Else
      cMsg:=cMsg+"NÃO é UTF-8: "+aText[i]+CRLF
    Endif
   
   cMsg:=cMsg+CRLF
   
 Next
 MsgInfo(cMsg)
Return

FuncTion IsUtf8( cString )

   Local i, cIdUtf := Chr( 195 )

   Local aUtf  := { 129, 130, 131, 132, 135, 137, 138, 141, 147, 148, ;
                    149, 150, 154, 156, 160, 161, 163, 162, 164, 167, ;
                    169, 170, 173, 179, 180, 181, 182, 186, 188 }

   For i = 1 To Len( aUtf )
    If At( cIdUtf + Chr( aUtf[ i ] ), cString ) > 0
     Return ( .T. )
    Endi
   Next

Return ( .F. )


Function IsAnsi( cString )

   Local i, aAnsi := { 196, 193, 194, 195, 201, 202, 205, 211, 212, 213, ;
                       218, 220, 225, 227, 231, 234, 237, 243, 244, 245, ;
                       246, 250, 252 }

   For i = 1 To Len( aAnsi )
    If At( Chr( aAnsi[ i ] ), cString ) > 0 .And. !IsUtf8( cString )
     Return ( .T. )
    Endi
   Next

Return ( .F. )

Function IsOem( cString )
      
   Local i, aOem  := { 128, 129, 130, 131, 132, 133, 135, 136, 142, 144, ;
                       147, 148, 153, 154, 160, 161, 162, 163, 181, 182, ;
                       198, 229, 210 }

   For i = 1 To Len( aOem )
    If At( Chr( aOem[ i ] ), cString ) > 0 .And. !IsUtf8( cString )
     Return ( .T. )
    Endi
   Next

Return ( .F. )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Como posso identificar a codificação do arquivo?

Mensagem por Pablo César »

kkkk agora você me fez rir Jairo. Mas vindo de você amigo... tem muito crédito comigo. Pois a humildade lamentavelmente vem de muitos poucos e você faz parte desso percentual, porque você é uma grande pessoa, muito grande.

Quanto o seu código, ficou chóia-da-Alemanha ! Excelente ! Ficou mais abrangente e bem mais entendível por substituir as funções em C. Sobre o quarto elemento aText e o seu resultado, não está errado também e não creio que isso tenha jeito. No entanto é muito raro um texto sem acentuação e sem C cedilhas.

Parabéns Jairo ! Valeu ! Agora sim, ficou bem melhor.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder