Ir para conteúdo
  • Cadastre-se

dev botao

Download da NFe pelo comando docZip.Items[i].XML retornando caractere desformatado por causa de acento


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

Recommended Posts

Postado

Bom dia Srs.,

 

Esse pode ser um problema bem simples mas não consigo resolver.

Todas as vezes que consulto notas e faço o download a função docZip.Items.XML retorna o XML com o caractere desfigurado em razão da acentuação.

A minha pergunta é: como resolvo essa situação mantendo o acento?

Obrigado!

 

Postado

Bom dia,

Alguém tem alguma sugestão?

Isso começou a acontecer quando migrei do Delphi 7 para o 2010, obviamente tem problema de codificação utf8 porém não consigo achar aonde pode ser o problema.

Até agora descobri que o componente ACBR na propriedade TRetDistDFeInt.SetdocZip está retornando sem a codificação UTF8 não vindo os caracteres especiais como os acentos.

Obrigado!

  • Membros Pro
Postado

Bom dia,

Não ocorreu para mim este tipo de situação com o webservice de Distribuição.

Tive tratar tais caracteres em retornos de webservices feitos em Java ou PHP.

Mas a solução é bem óbvia e "low-tech": bastaria fazer um StringReplace nos caractéres estranhos. 

Postado (editado)

Bom dia. 

aqui acontece o seguinte.

tenho um arquivo xml de nf-e que pelo browser abre normal com acentos.

ao usar o ACBrNFe1.NotasFiscais.LoadFromFile();

na propriedate ACBrNFe1.NotasFiscais.Items[N].xml aparecem caracteres estranhos, exemplo no xml esta Acessórios,apos abrir pelo acbr fica Acessórios.

xml foi baixaido pelo site oficial da receita: http://www.nfe.fazenda.gov.br/portal/consultaRecaptcha.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=

Estou usando delphi Tokyo 10.2.2

 

 

 

Editado por Emerson Teixeira
Postado

Bom dia Emerson,

Este é o problema que estou tento e até então parece ser decorrente de codificação porém não encontrei solução até o momento.

 

  • 2 semanas depois ...
Postado
41 minutos atrás, mbarsil disse:

Bom dia, tive um problema parecido e usei a função "ConverteXMLtoNativeString" da AcbrUtil.

 

bom dia ..

tentei usar função ConverteXMLtoNativeString, mas ainda não funcionou.

o estranho é que se eu abrir o xml pelo stringlist do delphi, funciona.

Ex: 

xml :TStringlist;

xml := TStringlist.create;

xml.LoadFromFile('Arquivo.xml', TEnconding.UTF8);

 

Se abrir o xml no i.e. mostra tudo certo, com acentos, mas ao abrir este mesmo arquivo pelo ACBrNFe1.NotasFiscais.LoadFromFile('Arquivo.xml'), fica com caracteres estranhos ex: APÓS SERVIÇO DE CALIBRAÇÃO  (APÓS SERVIÇO DE CALIBRAÇÃO)

 

att.

  • 8 meses depois ...
Postado (editado)
Em 19/03/2018 at 12:25, Emerson Teixeira disse:

om dia ..

tentei usar função ConverteXMLtoNativeString, mas ainda não funcionou.

o estranho é que se eu abrir o xml pelo stringlist do delphi, funciona.

Ex: 

xml :TStringlist;

xml := TStringlist.create;

xml.LoadFromFile('Arquivo.xml', TEnconding.UTF8);

 

Se abrir o xml no i.e. mostra tudo certo, com acentos, mas ao abrir este mesmo arquivo pelo ACBrNFe1.NotasFiscais.LoadFromFile('Arquivo.xml'), fica com caracteres estranhos ex: APÓS SERVIÇO DE CALIBRAÇÃO  (APÓS SERVIÇO DE CALIBRAÇÃO)

 

att.

bom dia

este problema persiste, alguém conseguiu resolver este problema?

Fiz as seguintes constatações que talvez possam ajudar na resolução deste problema:

no método function TRetDistDFeInt.LerXml: boolean;, interceptei a string decodificada no padrão zip e a salvei em um arquivo.

Quando passa pela linha abaixo:

FdocZip.Items.FInfZip := UnZip(StrDecod);

o arquivo zip já está com problemas de encoding, porém se pego este arquivo e descompacto via 7-zip, por exemplo, o mesmo fica com a codificação correta.

Logo, concluo que o problema está na ferramenta de descompactação. Atualizei pelo site http://synapse.ararat.cz/doku.php/download porém o problema persiste. Meu próximo teste seria encontrar uma ferramenta no delphi que descompacte corretamente o xml do zip.

Os desenvolvedores do ACBR podem nos ajudar neste sentido?

Agradeço antecipadamente.

 

 

 

 

 

 

 

 

000000000055725.zip

000000000055725-ComErrodeCodificação.xml

000000000055725-Correto.xml

Editado por Danilo Gazzoli
  • Curtir 1
  • Fundadores
Postado

O Fato de Zipar, DeZipar, não altera o Encoding de um arquivo...

Analisando...

O problema ocorre... porque o conteúdo do ZIP está sem a Declaração do XML, no inicio do arquivo... ou seja, falta

<'?xml version="1.0" encoding="UTF-8"?'>

https://xmlwriter.net/xml_guide/xml_declaration.shtml

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado
1 hora atrás, Daniel Simoes disse:

Acabo de enviar uma possível correção ao SVN...  Por favor atualize os fontes, e teste novamente...

olá Daniel

obrigado pelas respostas.

Como vc disse, entendo que "zipar", "deszipar" não altera o encoding do arquivo.

Porém, se eu subo o arquivo zip para um site que descompacta online, por exemplo: http://online.b1.org/online , o arquivo vem com a codificação correta.

Acabei de testar sua solução porém continua dando o mesmo erro. Estou anexando novamente o xml, resultante da sua alteração, para vc avaliar melhor.

Observe que o cabeçalho <?xml version="1.0" encoding="UTF-8"?> foi inserido desta vez, porém o arquivo continua com problema no nó:

<infCpl>*Conf. Arts. 465 a 469 do RICMS/SP, aprovado pelo Decreto 45.490/00*Não incidência do ICMS conf. Art.7 Inciso XIII do RICMS 45.490/00</infCpl>

 

obrigado pela ajuda.

 

 

000000000055725.xml

  • Curtir 1
Postado

boa tarde Daniel

a descompressão está correta, porém as funções Unzip e Decompress trabalham com  AnsiString como parâmetro.

O xml veio correto se trocar tais funções por:

unit ACBrUtil;

function UnZipW(const ABinaryString: String): String; overload;
var
  strAux: TStringStream;
begin
  strAux := TStringStream.Create(ABinaryString);
  try
    strAux.Seek(0, soFromBeginning);
    Result := ACBrCompress.DeCompressW(strAux);
  finally
    strAux.Free;
  end;
end;

unit ACBrCompress;

function DeCompressW(AStream: TStream): String;
var
  outMemStream: TMemoryStream;
begin
  outMemStream := TMemoryStream.Create;
  try
    AStream.Position := 0;
    DeCompress(AStream, outMemStream);

    outMemStream.Position := 0;
    with TStringStream.Create('', TEncoding.UTF8) do
    try
      CopyFrom(outMemStream, outMemStream.Size);
      Result := DataString;
    finally
      Free;
    end;
  finally
    outMemStream.Free;
  end;
end;

--------------------------------

Na unit pcnRetDistDFeInt, troque a linha

FdocZip.Items.FInfZip := UnZip(StrDecod);

para

FdocZip.Items.FInfZip := UnZipW(StrDecod);

---------------------------------

Obs: É apenas uma sugestão de codificação.

 

 

 

 

 

 

 

 

  • Curtir 1
  • Fundadores
Postado
Em 14/12/2018 at 13:57, Danilo Gazzoli disse:

a descompressão está correta, porém as funções Unzip e Decompress trabalham com  AnsiString como parâmetro.

Não creio que seja esse o problema... o uso de AnsiString é proposital, pois não queremos que ela tente interpretar o conteúdo...

o uso de AnsiString, é o indicado, quando o Buffer, possui caracteres de controle... como #0 e outros...

http://www.ararat.cz/synapse/doku.php/public:howto:binarystring

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado

entendo, porém aqui funcionou.

Este link que vc me mandou é de 2007. Naquela época não existiam os delphis mais novos com modificações de Strings.

[]s

 

dá uma olhada neste post, transcrevi aqui deste link (https://pt.stackoverflow.com/questions/51308/diferença-entre-ansistring-widestring-unicodestring-shortstring-e-string-e-com)

  • AnsiString: string composta por caracteres ASCII. Cada Char possui exatamente 1 bytes. Um ponteiro para uma AnsiString (^AnsiString) equivale a char* em C;

  • WideString: existe apenas por compatibilidade com o Windows. Cada Char possui 2 bytes, e deve ser utilizada em funções da Win32 com parâmetros LPWSTR, realizando um cast para PWChar;

  • UnicodeString: string unicode. Por padrão UTF-16 (ou pelo menos era quando pesquisei pela última vez), mas pode assumir outras codificações, como UTF-8.

  • ShortString: equivale a string antiga do Pascal, com sua limitação de de 255 caracteres.

  • String: nas versões mais novas do Delphi (2007 em diante), equivale a UnicodeString. Antigamente equivalia a AnsiString.

Tanto AnsiString quanto UnicodeString são mais do que um simples array of Char, sendo que elas possuem informações de página de código e tamanho. Porém, para facilitar o cast destes tipos para PChar e suas variações, estas informações ficam nos endereços anteriores ao retornado pelo operador @.

Conversão

A conversão entre elas é feita automaticamente. Único cuidado que deve ser tomado, é que dados podem ser perdidos durante a conversão devido ao tipo não suportar alguma característica da string de origem.

Por exemplo, converter UnicodeString para AnsiString, pode haver perda devido aos caracteres Unicode poderem ocupar mais que 1 byte.

Conversão de AnsiString (ou UnicodeString) para ShortString, haverá perda de dados se a string de origem for maior que 255 (Length(origem) > 255).

 

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.