Estou tentando realizar o download de uma NF-e da Sefaz, tudo funciona perfeitamente até executar a função ACBrUtil.ParseText, mais precisamente na chamada a função Utf8Decode que retorna vazio.
A função Utf8Decode faz chamada a função Utf8ToUnicode que devolve -1. Ou seja, ocorreu algum erro na conversão. Debugando... consegui encontrar que o problema ocorre quando a função Utf8ToUnicode passa pelo caractere BELL. Já tentei criar uma outra função para remover o BELL antes de chamar a função Utf8Decode, mas não deu certo.
Como “alternativa” fui na função ACBrUtil.ParseText e realizei algumas mudanças conforme abaixo, está resolvendo por enquanto, mas creio que não é uma boa opção, rs.
Segue em anexo o XML da NF-e que consegui após realizar a modificação na função ACBrUtil.ParseText.
Estou usando Delphi 2007.
Agradeço a quem puder ajudar.
function ParseText( Texto : AnsiString; Decode : Boolean = True;
IsUTF8: Boolean = True ) : AnsiString;
var
{Adicionado para resolver o problema de conversão}
TextoTemp: AnsiString;
begin
if Decode then begin
Texto := AnsiString(StringReplace(String(Texto), '&', '&', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), '<', '<', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), '>', '>', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), '"', '"', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), ''', #39, [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'á', 'á', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Á', 'Á', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'â' , 'â', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Â' , 'Â', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'ã', 'ã', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Ã', 'Ã', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'à', 'à', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'À', 'À', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'é', 'é', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'É', 'É', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'ê' , 'ê', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Ê' , 'Ê', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'í', 'í', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Í', 'Í', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'ó', 'ó', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Ó', 'Ó', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'õ', 'õ', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Õ', 'Õ', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'ô' , 'ô', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Ô' , 'Ô', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'ú', 'ú', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Ú', 'Ú', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'ü' , 'ü', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Ü' , 'Ü', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'ç', 'ç', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), 'Ç', 'Ç', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), ''', '''', [rfReplaceAll]));
{Adicionado para resolver o problema de conversão}
TextoTemp := Texto;
if IsUTF8 then
begin
{$IFDEF DELPHI12_UP} // delphi 2009 em diante
Texto := AnsiString(UTF8ToString(Texto));
{$ELSE}
Texto := Utf8ToAnsi(Texto);
{$ENDIF}
end;
end
else begin
Texto := AnsiString(StringReplace(String(Texto), '&', '&', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), '<', '<', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), '>', '>', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), '"', '"', [rfReplaceAll]));
Texto := AnsiString(StringReplace(String(Texto), #39, ''', [rfReplaceAll]));
if IsUTF8 then
begin
{$IFDEF DELPHI12_UP} // delphi 2009 em diante
Texto := AnsiString(UTF8ToString(Texto));
{$ELSE}
Texto := AnsiString(UTF8Decode(Texto));
{$ENDIF}
end ;
end;
{Adicionado para resolver o problema de conversão}
if Texto = '' then begin
Result := TextoTemp;
end
else begin
Result := Texto;
end;
end;
32150627124023000164550000000151741000043990-nfe.xml