PDA

View Full Version : Migração do 14 para o 20 - Problemas com caracteres acentuados



Vitor_MS
11-Mar-2022, 11:04 AM
Olá amigos, bom dia

Estou migrando uma aplicação do 14 para o 20, mas ao gerar arquivos TXT, todos os caracteres acentuados são escritos errados no 20.
No 14 escreve normal...


Exemplo:
Código do 14:
Move "*Pedidos feitos por depósito após o expediente bancário ou envelope só serão enviados após a compensação do mesmo." to Linhas
Write Linhas

Texto gerado no arquivo:
*Pedidos feitos por depósito após o expediente bancário ou envelope só serão enviados após a compensação do mesmo.



Código no 20:
Move "*Pedidos feitos por depósito após o expediente bancário ou envelope só serão enviados após a compensação do mesmo." to Linhas
Write Linhas


Texto gerado no arquivo:
*Pedidos feitos por dep+¦sito ap+¦s o expediente banc+írio ou envelope s+¦ ser+úo enviados ap+¦s a compensa+º+úo do mesmo.

O que mudou? como lidar com isso?
Continuo utilizando o COLLATE em Inglês, herdado desde a versão 7.


Grato desde já a todos.

Vitor M Silva,
Campo Grande/MS

Samuel Pizarro
11-Mar-2022, 11:25 AM
Df 20 agora eh unicode...

Qual programa vc esta usando para ver/ler o arquivo gerado?

Ele suporta unicode?

Edgard
11-Mar-2022, 03:25 PM
Oi Vitor,

Embora sempre usei Collate=Portugues desde VDF6 , acabei criando a função abaixo, assim fica fácil adequar o tipo de saída, que você pretende e até serviu de ponte, para minha migração de DF19 para DF20.




Function ConVdfxWin String sConteudo Integer iFlag Returns String


Address aUTFBuffer
Integer iLen
String sVar


//Como iFlag=0 e iFlag=1 refere-se a versão anterior ao df20, nada faz em DF20 porque isto resolve a maioria dos problemas, ou seja, neste caso estamos tratando: Windows (UTF8) = DF (UTF8) ou vice versa
//Por outro lado, como no DF20 o padrão é UTF8, podemos ter a seguinte regra:
If (iFlag>1) Begin

If (iFlag=2);
Move (Utf8ToOem(sConteudo)) to sVar


If (iFlag=3);
Move (Utf8ToAnsi(sConteudo)) to sVar

If (iFlag=4) Begin
// Move OEM to UTF8 buffer
Get Utf8FromBuffer of oCharTranslate (AddressOf(sConteudo)) CP_OEMCP to aUTFBuffer
// Move UTF8 Buffer to UTF8 String
Get Utf8ToStr of oCharTranslate aUTFBuffer CP_UTF8 to sVar


End

If (iFlag=5) Begin
// Move ANSI to UTF8 buffer
Get Utf8FromBuffer of oCharTranslate (AddressOf(sConteudo)) CP_ACP to aUTFBuffer
// Move UTF8 Buffer to UTF8 String
Get Utf8ToStr of oCharTranslate aUTFBuffer CP_UTF8 to sVar


End

Move (Free(aUTFBuffer )) to iLen
Move sVar to sConteudo

End

Function_Return sConteudo

End_Function




Espero que ajude no seu caso.

Abraços

Edgard

Vitor_MS
16-Mar-2022, 09:29 AM
Hmm Samuel, é por isso então.. ele não suporta.. é um gerador de relatórios.. obrigado.

Vitor_MS
16-Mar-2022, 09:30 AM
Obrigado Edgard.. vou testar aqui

Att..

Vitor

felipesilva
5-Sep-2022, 09:52 AM
Df 20 agora eh unicode...

Qual programa vc esta usando para ver/ler o arquivo gerado?

Ele suporta unicode?

Olá Samuel, tudo bem?

Será que dá para utilizar como OEM? Ou somente UNICODE?

Abraço

Edgard
5-Sep-2022, 01:09 PM
Olá Felipe,

Não, que eu seja o Samuel ;) . . .

Se sua pergunta, refere-se ao Studio, ele coexiste com os dois, mas enquanto você estiver trabalhando, com versão anterior, deixe a opção OEM marcada, para não fazer uma salada de letras de código fonte:

15649

Se você está se referindo ao BD considere, que o UNICODE (DF20) e se não estiver usando o banco incorporado DATAFLEX, vai suportar por exemplo:
15650
isto no incorporado mesmo em DF20, após salvar apareceria como: "?"

Estou em SQL e o Samuel em DB2 e acredito, que funcione da mesma forma.

Antes de estar em SQL, estava coexistindo normalmente entre DF20 e DF19 no incorporado, mas nem pensar em usar nada diferente entre UNICODE x OEM.

Att.

Edgard Luis Paneque

Samuel Pizarro
5-Sep-2022, 01:47 PM
Será que dá para utilizar como OEM? Ou somente UNICODE?

Olá felipe. Como o edgard disse, depende do que vc esta se referindo.

No que se refere a criar arquivos texto ou ler arquivos texto (Direct_Input/Direct_Output) , sim. mas vc precisa converter manualmente a string.

as variaveis string ate o 19.1 eram no formato OEM, mas a partir da versao 20.0 agora elas sao utf-8 (um dos possiveis encoding pra unicode)

se vc quer forçar que os caracteres sejam gravados no arquivo txt utilizando o formato OEM, vc precisa converter na chamada do write/writeln

writeln (toOEM(sVariavel))

O que pre mim, nao faz sentido nenum.. o Qto antes vcs sairem do oem e adotarem o unicode pra valer eh melhor. !

Se por outro lado, vc nao esta falando de geracao de arquivos textos, e está falando sobre banco de dados, a conversa eh mais complexa..

[]'s

felipesilva
5-Sep-2022, 01:48 PM
Olá Edgard, obrigado pela atenção...

Na verdade estou me referindo ao Dataflex em tempo de execução (variáveis String)... Pelo que estou percebendo, a partir da DF20, ele só trabalha com "Unicode"...

Por exemplo, nas versões anteriores, nós realizavamos a leitura (readln) de arquivos de texto codificados em ANSI e funcionava sem problemas... Agora na DF20 vamos precisar converter para UTF8 (OemToUTF8)...

Seria isso?

felipesilva
5-Sep-2022, 01:50 PM
Obrigado Samuel... era sobre arquivos texto mesmo...

Então é isso mesmo... as "strings" agora são tudo "unicode" (UTF8)... vamos ter de rever nossas rotinas...

Será que existe alguma ferramenta para converter arquivos de ANSI para UTF8 (em lote)?

Um abraço...

Samuel Pizarro
5-Sep-2022, 02:05 PM
Por exemplo, nas versões anteriores, nós realizavamos a leitura (readln) de arquivos de texto codificados em ANSI e funcionava sem problemas..

ANSI eh diferente de OEM, que eh diferente de Unicode.

Se funcionava bem entao seu arquivo nao estava em ANSI e sim OEM (codepage 850 pra ser mais exato)

se seu arquivo estivesse em ANSI, vc teria que converter pra OEM apos a leitura pra ficar correta.

---- ate df 19.1 -----


// arquivo em OEM
Readln sVariavel // string ja em OEM (850)

// arqhivo em ansi
Readln sVariavel
move (ToOem(sVariavel)) to sVariavel // agora a string estaria em OEM (850)



---- apos 20.0----


// lendo um arquivo utf-8
Readln sVariavel // ja no formato esperado que eh utf-8 (unicode)

// lendo de um arquivo ansi (1252)
ReadLn sVariavel
Move (AnsiToUtf8(sVariavel)) to sVariavel

// lendo de um arquivo OEM (850)
Readln sVariavel
Move (OEMtoUtf8(sVariavel)) to sVariavel




Para as versoes 19.1 e anteriores, até dava pra ler um arquivo utf-8. mas era mais complicado. tinha que ler em blocos, utilizando char-arrays , e utilizar a classe cCharTranslate pra converter


[]s

Samuel Pizarro
5-Sep-2022, 02:06 PM
O DF nao tem

Deve existir ferramentas por ai , nunca precisei.

O Notepad++ tem opcao.. mas nao seria uma boa opcao pra fazer em lotes.

felipesilva
5-Sep-2022, 02:11 PM
Ok Samuel... muito obrigado pela ajuda!

Abraço

Edgard
5-Sep-2022, 02:17 PM
Eu tinha umas mascaras fixas (textos de cartas oriundas do OEM), converti manualmente em um diretório paralelo via bloco de notas, para UNICODE e quando implantei DF20, foi só renomear.

Mesmo assim eu tenho um caso de um módulo, que importa e exporta, para outros sistemas.
Neste caso de certa forma eu fazia um trabalho de conversão e para não dar problemas deixei um parâmetro, que configuro em tempo de execução para cada caso:

15651

Isto chama a rotina, que postei em 11/03 nesse tópico.

Concordo com o Samuel, migre o mais rápido possível, para não ter de ficar quebrando a cabeça e uma vez em DF20 esqueça o passado.

felipesilva
5-Sep-2022, 03:34 PM
Show Edgard... muito obrigado!

Abraço