Leer comprobantes no codificados en UTF8

Para los que programamos en Delphi, aqui estan las respuestas
[[ FORO CERRADO DEBIDO A QUE YA LA INFORMACION YA NO ES VIGENTE ]]
s3cr3to
Mensajes: 501
Registrado: Mar Dic 28, 2010 2:12 pm

Leer comprobantes no codificados en UTF8

Mensajepor s3cr3to » Vie Nov 14, 2014 2:01 pm

Buen día.

Estoy preparando una aplicación (en Delphi 7) para leer los comprobantes, revisar su vigencia y registrarlos en nuestra BD.
Hasta ahora todo bien, excepto con unos casos donde el comprobante esta codificado de manera diferente a utf-8 (con y sin bom).
Estos vienen codificados como UCS2-L (al menos hasta ahora) creo que estos son Unicode.
Entonces, con este código he logrado identificar los utf-8 que si puedo cargar y procesar.

Código: Seleccionar todo


function UTF8Comprueba (FileName : string): boolean;
var
    Stream: TFileStream;
    bom : array[0..3] of byte;
    flagTest : boolean;
begin
  flagTest:= False;
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Stream.ReadBuffer(bom, SizeOf(bom)); //rGet the byte-order mark, if there is one
    if ((bom[0] = $ef) and (bom[1] = $bb) and (bom[2] = $bf))
      or ((bom[0] = $3c) and (bom[1] = $3f) and (bom[2] = $78)) //3C 3F 78 6D
      or ((bom[0] = $3c) and (bom[1] = $63) and (bom[2] = $66)) //60 99 102 100 utf-8 w/o BOM
    then flagTest:= True;  // utf-8
  finally
    Stream.Free;
  end;
  Result:= flagTest;
end;

Con esto cargo el comprobante en un registro:

Código: Seleccionar todo

function LeerDatosCFD (sFileName : string; var vData: TdataCFD) : boolean;
var flag: boolean;
  temp : TStringList;
  XMLDoc1, TimbreXMLDoc : IXMLDocument; //TXMLDocument;
  CFD32 : cfdv32.IXMLComprobante;
  CFD3 : cfdv2030.IXMLComprobante;
  CFD2 : cfdv2030.IXMLComprobante;
  TimbreDatos : TimbreFiscalDigital.IXMLTimbreFiscalDigital;
  AttrNode : IXMLNode;
begin
  flag:= False;

  with vData do begin
    version := '';  Emisor := '';    Receptor := ''; Fecha := '';  FechaTimbrado:= '';
    UUID := '';     Serie := '';       Folio := '';      Total := '';   TotalImpuestosRetenidos := '';
    TotalImpuestosTrasladados := '';    Moneda:= ''; TipoCambio := '';
  end;

  if UTF8Comprueba(sFileName) then
  begin
    try
      temp:= TStringList.Create;
      temp.LoadFromFile(sFileName);
      XMLDoc1:= NewXMLDocument;
      TimbreXMLDoc:= NewXMLDocument;
      XMLDoc1.LoadFromFile(sFileName); // este carga los comprobantes correctos UTF-8 y truena con los unicode

      if pos('version="3.2"', temp.Text) > 0 then
      begin
        XMLDoc1.Active := true;
        CFD32 := cfdv32.GetComprobante(XMLDoc1);
        // obtener complemento...
        AttrNode:= CFD32.Complemento.ChildNodes.FindNode('TimbreFiscalDigital', CFD32.Complemento.FindNamespaceURI('tfd'));
        TimbreXMLDoc.XML.Text:=  UTF8Encode(AttrNode.XML);
        TimbreXMLDoc.Active := true;
        TimbreDatos := GetTimbreFiscalDigital(TimbreXMLDoc);
        with vData do begin
          version := CFD32.version;             Emisor := CFD32.Emisor.Rfc;          Receptor := CFD32.Receptor.Rfc;
          Fecha := CFD32.Fecha;                 UUID := TimbreDatos.UUID;           FechaTimbrado := TimbreDatos.FechaTimbrado;
          Serie := CFD32.Serie;                   Folio := CFD32.Folio;
          Total := CFD32.Total;                   Moneda:= CFD32.Moneda;            TipoCambio:= CFD32.TipoCambio;
          TotalImpuestosRetenidos := CFD32.Impuestos.TotalImpuestosRetenidos;
          TotalImpuestosTrasladados := CFD32.Impuestos.TotalImpuestosTrasladados;
        end;
        flag:= True;
      end //3.2
      else
      if pos('version="3.0"', temp.Text) > 0 then
      begin
        //... blah blah
        flag:= True;
      end //3.0
      else
      if pos('version="2.0"', temp.Text) > 0 then
      begin
        XMLDoc1.Active:= true;
        CFD2 := cfdv2030.GetComprobante(XMLDoc1);
        with vData do begin
          version := CFD2.version;   Emisor := CFD2.Emisor.Rfc;   Receptor := CFD2.Receptor.Rfc;
          Fecha := CFD2.Fecha;       UUID := ''; // no, aqui no hay
          Serie := CFD2.Serie;   Folio := CFD2.Folio;   Total := CFD2.Total;
          TotalImpuestosRetenidos := CFD2.Impuestos.TotalImpuestosRetenidos;
          TotalImpuestosTrasladados := CFD2.Impuestos.TotalImpuestosTrasladados;
        end;
        flag:= True;
      end; // 2.0
    finally
      temp.Free;
    end;
  end;
  Result:= flag;
end;

El problema no se como leer y decodificar los comprobantes no UTF-8. sin que truene en: XMLDoc1.LoadFromFile(sFileName);
¿Alguien que puede compartir algún tip-truco-código en Delphi7 para leer estos archivos? para así obtener los datos del comprobante.
Hasta ahora, los tengo que abrir en notepad++ y convertir a utf8... algo bastante "problematico" para los usuarios.

Saludos y gracias de antemano.
Adjuntos
UCS2-LE_wo_BOM.xml
con datos ficticios.
(8.93 KiB) Descargado 413 veces

Volver a “Delphi”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado