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: 7135
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: 8029
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 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: 8029
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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