Jump to content

Assista tectoy.png

Protocolo de comunicação sendo quebrado por encoding


jjw.roberto
  • Este tópico foi criado há 2181 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Pessoal, boa tarde.

Baixei e compilei todo o projeto do ACBr em Lazarus 1.6 Windows.

Comecei a utilizar o modo de comunicação do ACBr Monitor Plus via TCP, para integrar minha aplicação feita em Java.

Até o momento tudo corria bem, mas agora me deparei com um problema, que acredito ser gerado pelo Lazarus.

Tenho uma impressora Bematech e uma Epson. Ambas tem formas de pagamento com acentuação já programas.

Quando obtenho junto ao ACBrMontiorPlus as formas de pagamento (comando ECF.CarregaFormasPagamento) o contrato de retorno está sendo quebrado.

Veja no seguinte exemplo de retorno:

OK:    1                       Dinheiro|   2V                       Cartão

Formatando melhor o retorno para verificarmos a falta de caracteres:

 IIIITDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
"   1                       Dinheiro"
"   2V                       Cartão"

Note que na descrição cartão está faltando um caracter, são na verdade somente 29 posições (ao invés de 30) retornadas pelo ACBrMonitorPlus.

Não estou conseguindo descobrir como resolver isso (até porque não tenho grandes conhecimentos em Lazarus), porém acredito que isso esteja ocorrendo pois a String é UTF-8, onde no caso a caracter ã é representado em 2 bytes em UTF-8, diferentemente que no ANSI aonde é 1 byte.

Já tentei trocar aquele parâmetro no ACBrMonitor para usar comunicação ANSI mas o problema continua.

Fiz a depuração do ACBrMonitorPlus, e o problema aparece no ACBrUtils.pas na função abaixo:

function PadLeft(const AString : String; const nLen : Integer;
   const Caracter : Char) : String ;
var
  Tam: Integer;
begin
  Tam := Length(AString);        <<< ESTE LENGTH('Cartão') retorna 7 ao invés de 6!!!!
  if Tam < nLen then
    Result := StringOfChar(Caracter, (nLen - Tam)) + AString
  else
    Result := LeftStr(AString, nLen) ;  //RightStr(AString,nLen) ;
end ;  

Alguém pode me ajudar a resolver isso?

 

Obrigado!

 

Link to comment
Share on other sites

  • Este tópico foi criado há 2181 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.