Manipular arquivos com acento

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

Moderador: Moderadores

marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Manipular arquivos com acento

Mensagem por marco.prodata »

Caros,
Estou fazendo um pequeno programa que recebe o nome de um arquivo como parametro para fazer algumas leituras, só que alguns arquivos com acentuação no nome do mesmo, não estão funcionando:
Exemplo: "MovimentaçãoPixBB (43).txt"

quando executo:
processa "MovimentaçãoPixBB (43).txt"

e dentro do aplicativo testo um if file(), retorna que o arquivo não existe.

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO
REQUEST HB_CODEPAGE_PT850

function main 
*************
para wArquivo 

hb_SetCodepage("PT850")

altd()

if !file(wArquivo)
   return nil 
endif    

Imagem

Como resolver?
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Manipular arquivos com acento

Mensagem por sygecom »

Faça um teste usando o caminho completo do arquivo e, usando: hb_FileExists()

exemplo:

if hb_FileExists('c:\arquivo\MovimentaçãoPixBB (43).txt')
alert('achou')
else
alert('nao achou')
endif
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Manipular arquivos com acento

Mensagem por Itamar M. Lins Jr. »

Olá!
Tem que usar a mesma página de código do nome do arquivo.
No editor do prg usando pagina (x) no seu aplicativo 850 e foi criado o arquivo usando UTF8.(hipótese)

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Manipular arquivos com acento

Mensagem por marco.prodata »

Itamar M. Lins Jr. escreveu:Olá!
Tem que usar a mesma página de código do nome do arquivo.
No editor do prg usando pagina (x) no seu aplicativo 850 e foi criado o arquivo usando UTF8.(hipótese)

Saudações,
Itamar M. Lins Jr.
Abrindo o arquivo pelo VSCode indica que o mesmo foi feito em UTF8, o conteúdo dele está em UTF8, o problema está no parâmetro que passo do prompt, esse parâmetro que não estou conseguindo converter, se eu forçar um if file("Movimentação.txt") por exemplo funciona, o problema é que os acentos do nome do arquivo ele buga na conversão.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Manipular arquivos com acento

Mensagem por marco.prodata »

sygecom escreveu:Faça um teste usando o caminho completo do arquivo e, usando: hb_FileExists()
Deu o mesmo erro, acusando que o arquivo não existe.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Manipular arquivos com acento

Mensagem por marco.prodata »

Um teste, se eu usar a função directory("mov*.txt") ele pega o nome corretos dos arquivos, o problema esta quando chamo:
meuPrograma <nomeDoArquivo>.txt
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Manipular arquivos com acento

Mensagem por Itamar M. Lins Jr. »

Olá!

Código: Selecionar todos

IF hb_FileExists( hb_Translate(wArquivo,"PT850","UTF8EX") )
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Manipular arquivos com acento

Mensagem por marco.prodata »

Achei a solução em uma resposta antiga do Przmek na lista do harbour, por padrão as strings passadas pelo prompt de comando como argumentos sempre vem com o codepage EN, e os parametros recebidos antes de conseguir mudar o codepage no main, logo, buga os caracteres antes, o jeito é executar a mudança de codepage antes do main.
INIT PROCEDURE CLIPINIT
SET(_SET_CODEPAGE,"PT850")
RETURN
essa procedure é executada antes do main.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Manipular arquivos com acento

Mensagem por JoséQuintas »

Talvez assim:

Código: Selecionar todos

FUNCTION Main( ... )

   LOCAL aParList

   Set( _SET_CODEPAGE, "PTISO" )
   aParList := hb_AParams()
Se der certo, pode passar a receber uma lista de arquivos, e não apenas um.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder