Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Base64.decode64 isn't working as MRI implementation #2815

Closed
Myuzu opened this issue Apr 9, 2015 · 14 comments
Closed

Base64.decode64 isn't working as MRI implementation #2815

Myuzu opened this issue Apr 9, 2015 · 14 comments

Comments

@Myuzu
Copy link

Myuzu commented Apr 9, 2015

# ruby 2.2.1p85
Base64.encode64 "some_string"
"c29tZV9zdHJpbmc=\n"

Base64.decode64 "c29tZV9zdHJpbmc"
"some_string"

Base64.urlsafe_decode64 "c29tZV9zdHJpbmc"
ArgumentError: invalid base64

Base64.strict_decode64 "c29tZV9zdHJpbmc"
ArgumentError: invalid base64
# jruby 1.7.19 (2.0.0p598)
Base64.encode64 "some_string"
"c29tZV9zdHJpbmc=\n"

Base64.decode64 "c29tZV9zdHJpbmc"
"some_stri"

Base64.urlsafe_decode64 "c29tZV9zdHJpbmc"
"some_stri"

Base64.strict_decode64 "c29tZV9zdHJpbmc"
"some_stri"

I saw #2551 issue so some of these were fixed, but what about Base64.decode64? Should it return some_string or some_stri if I remove padding from encoded string?

@Myuzu
Copy link
Author

Myuzu commented Apr 9, 2015

I searched a little bit and found similar issue for MRI ruby/ruby#815. They merged support for padding in Base64.urlsafe_encode64 and Base64.urlsafe_decode64. Now Base64.urlsafe_decode64 supports unpadded input.

@headius
Copy link
Member

headius commented Apr 17, 2015

@Myuzu I have requested that the fix for ruby/ruby#815 be backported to 2.2, since we use mostly-unmodified MRI stdlib.

@MSNexploder
Copy link
Contributor

9.1.9.0 behaves just like MRI 2.3.3

Base64.encode64 "some_string"
# => "c29tZV9zdHJpbmc=\n"

Base64.decode64 "c29tZV9zdHJpbmc"
# => "some_string"

Base64.urlsafe_decode64 "c29tZV9zdHJpbmc"
# => "some_string"

Base64.strict_decode64 "c29tZV9zdHJpbmc"
# => ArgumentError: invalid base64

@BanzaiMan
Copy link
Member

@MSNexploder Thanks for checking!

@kares kares added this to the Invalid or Duplicate milestone May 29, 2017
@alejandroMA
Copy link

i can't upgrade my jruby from 1.3, any work around ?

@Myuzu
Copy link
Author

Myuzu commented Nov 17, 2017

@alejandroMA
Copy link

thank you @Myuzu , although I already tried that:

cfdi = '<cfdi:Comprobante version="3.2" serie="Q" folio="2674" fecha="2017-11-08T13:03:34" sello="D63gob+YmFpXyJYJPbdKbJCKvUMoM6gEaB/euv2rkma0RH15yFV/PCoS18f4rxI9TKXky7qAmivFJKFTbZRuV3+YmVslLnqnM5opf8kFKH6PMzjPUGu+8xSN1ie+VUAq49ISWyl6TGbVKNcCoMwHMtttk++OV8EqTE3KnRfT7qBQ8wSYm++KC/BKawytGGeJQqVsSjjM7sQjT1ZM36EEW4DmEBo7QUvP12ntGcr3IbK9036dj7uFbcy5eWabIKEhyarWshXQiX2e9rLCsWHH4zlj4QqY6pSY7hiPcHsOd8v1lygTYiKlLovjse90ceguCf2Ar60hRNxCkAm5QsfpWA==" formaDePago="pago en una sola exhibicion" noCertificado="00001000000404442195" certificado="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" condicionesDePago="CREDITO" subTotal="1415700.00" descuento="0.00" motivoDescuento="X" TipoCambio="1.000" Moneda="Pesos" total="1642212.00" tipoDeComprobante="ingreso" metodoDePago="03" LugarExpedicion="El Marqués,QUERETARO" NumCtaPago="5491" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><cfdi:Emisor rfc="EMY861219J58" nombre="EMYCSA S.A.  DE C.V."><cfdi:DomicilioFiscal calle="KM 207 MAS 700 CARRETERA A DELICIAS " noExterior="SN" colonia="Aquiles Serdán" localidad="CHIHUAHUA" municipio="Aquiles Serdán" estado="CHIHUAHUA" pais="MEXICO" codigoPostal="31650" /><cfdi:ExpedidoEn calle="EL TEPEYAC" noExterior="11090" colonia="El Tepeyac" municipio="El Marqués" estado="QUERETARO" pais="MEXICO" codigoPostal="76250" /><cfdi:RegimenFiscal Regimen="REGIMEN GENERAL DE PERSONAS MORALES" /></cfdi:Emisor><cfdi:Receptor rfc="CCU910805CP8" nombre="CONSTRUCTORA CHUFANI SA DE CV"><cfdi:Domicilio calle="CIRCUITO PALMA COCOTERA" noExterior="2020" colonia="PALMARES DE QUERETARO" localidad="QUERETARO" municipio="Querétaro" estado="QUERETARO" pais="MEXICO" codigoPostal="76127" /></cfdi:Receptor><cfdi:Conceptos><cfdi:Concepto cantidad="1" unidad="NO APLICA" descripcion="ESTIMACION NO. 5" valorUnitario="2178000.00" importe="2178000.00" /><cfdi:Concepto cantidad="1" unidad="NO APLICA" descripcion="25% AMORTIZACION DE ANTICIPO" valorUnitario="-544500.00" importe="-544500.00" /><cfdi:Concepto cantidad="1" unidad="NO APLICA" descripcion="10% FONDO DE GARANTIA&#xD;&#xA;POR LOS TRABAJOS DE SUMINISTRO, FABRICACION Y MONTAJE&#xA;DE ESTRUCTURA Y CUBIERTA METALICA.&#xA;CONTRATO: 2017-1085-22324.&#xA;PROVEEDOR: 125.&#xA;PEDIDO: 4500022324.&#xA;ENTRADA: 1000114541.&#xA;&#xA;DE LA OBRA: NHK SPRING MEXICO.&#xA;UBICADA EN: IRAPUATO, GTO." valorUnitario="-217800.00" importe="-217800.00" /></cfdi:Conceptos><cfdi:Impuestos totalImpuestosRetenidos="0.00" totalImpuestosTrasladados="226512"><cfdi:Retenciones><cfdi:Retencion impuesto="ISR" importe="0.00" /><cfdi:Retencion impuesto="IVA" importe="0.00" /></cfdi:Retenciones><cfdi:Traslados><cfdi:Traslado impuesto="IVA" tasa="16" importe="226512" /><cfdi:Traslado impuesto="IEPS" tasa="0" importe="0" /></cfdi:Traslados></cfdi:Impuestos><cfdi:Complemento><tfd:TimbreFiscalDigital version="1.0" UUID="f3f3a856-8a47-4fc6-bc89-a711c3688105" FechaTimbrado="2017-11-08T14:03:43" selloCFD="D63gob+YmFpXyJYJPbdKbJCKvUMoM6gEaB/euv2rkma0RH15yFV/PCoS18f4rxI9TKXky7qAmivFJKFTbZRuV3+YmVslLnqnM5opf8kFKH6PMzjPUGu+8xSN1ie+VUAq49ISWyl6TGbVKNcCoMwHMtttk++OV8EqTE3KnRfT7qBQ8wSYm++KC/BKawytGGeJQqVsSjjM7sQjT1ZM36EEW4DmEBo7QUvP12ntGcr3IbK9036dj7uFbcy5eWabIKEhyarWshXQiX2e9rLCsWHH4zlj4QqY6pSY7hiPcHsOd8v1lygTYiKlLovjse90ceguCf2Ar60hRNxCkAm5QsfpWA==" noCertificadoSAT="00001000000407908743" selloSAT="uAX5FqlUWnTqRBQm+j99NonxrL5YSzKE/obC3eDfhO1wUkiFlJootBWsdutyKdBibLNRjsdS4SqMNzH6ocMjAlB3Tdrlkma091f5xS7vESfVJMnh7Hcujq7nlwNmpFt6PZ6rWdYa5gJ6UEx55tF01N3p9VbYo5lJH0USIaqrb+fb2hB0Yzgm5/C9c//ios4TQMKw/qZcT87c0s6MYT4yIHN+NRo5g/4FbCGcjfYsD12il3makYjuGJxaXWU2onYnMIUvJ+JnhvQvR6sNs4Ifp1B7Y4oHsM5Ifxx0RCYkBRnAa6G97Iqv/aLQEOO0pQ4sIDjEESKT1ak6tTf9biiAQQ==" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/TimbreFiscalDigital/TimbreFiscalDigital.xsd" xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" /></cfdi:Complemento></cfdi:Comprobante>'
encodedCfdi = [cfdi].pack("m0")

it doesn’t generate the valid base64 string, it generates a close one, but not close enough

do you have any other idea?

@Myuzu
Copy link
Author

Myuzu commented Nov 17, 2017

@alejandroMA as I originally understand you need proper urlsafe_encode64 without padding, not strict_encode64. Based on this:

def urlsafe_encode64(bin, padding=true)
  str = strict_encode64(bin).tr("+/", "-_")
  str = str.delete("=") unless padding
  str
end

def urlsafe_decode64(str)
  str = str.tr("-_", "+/")
  if !str.end_with?("=") && str.length % 4 != 0
    str = str.ljust((str.length + 3) & ~3, "=")
  end
  strict_decode64(str)
end

encodedCfdi = urlsafe_encode64(cfdi, false)

With this done you can safely ignore padding characters (=). If I understand your problem correctly.

@alejandroMA
Copy link

Sorry @Myuzu I think I misunderstood this "github issue", in jruby 1.3 "strict_encode64(bin)" is not even available, my problem is that "Base64.encode64(bin)" is yielding a wrong result, it breaks my original data.

@Myuzu
Copy link
Author

Myuzu commented Nov 17, 2017

@alejandroMA can you provide actual and expected behavior on your data?

@alejandroMA
Copy link

alejandroMA commented Nov 17, 2017

yes @Myuzu

Expected:

PGNmZGk6Q29tcHJvYmFudGUgdmVyc2lvbj0iMy4yIiBzZXJpZT0iUSIgZm9saW89IjI2NzQiIGZlY2hhPSIyMDE3LTExLTA4VDEzOjAzOjM0IiBzZWxsbz0iRDYzZ29iK1ltRnBYeUpZSlBiZEtiSkNLdlVNb002Z0VhQi9ldXYycmttYTBSSDE1eUZWL1BDb1MxOGY0cnhJOVRLWGt5N3FBbWl2RkpLRlRiWlJ1VjMrWW1Wc2xMbnFuTTVvcGY4a0ZLSDZQTXpqUFVHdSs4eFNOMWllK1ZVQXE0OUlTV3lsNlRHYlZLTmNDb013SE10dHRrKytPVjhFcVRFM0tuUmZUN3FCUTh3U1ltKytLQy9CS2F3eXRHR2VKUXFWc1Nqak03c1FqVDFaTTM2RUVXNERtRUJvN1FVdlAxMm50R2NyM0liSzkwMzZkajd1RmJjeTVlV2FiSUtFaHlhcldzaFhRaVgyZTlyTENzV0hINHpsajRRcVk2cFNZN2hpUGNIc09kOHYxbHlnVFlpS2xMb3Zqc2U5MGNlZ3VDZjJBcjYwaFJOeENrQW01UXNmcFdBPT0iIGZvcm1hRGVQYWdvPSJwYWdvIGVuIHVuYSBzb2xhIGV4aGliaWNpb24iIG5vQ2VydGlmaWNhZG89IjAwMDAxMDAwMDAwNDA0NDQyMTk1IiBjZXJ0aWZpY2Fkbz0iTUlJR0NUQ0NBL0dnQXdJQkFnSVVNREF3TURFd01EQXdNREEwTURRME5ESXhPVFV3RFFZSktvWklodmNOQVFFTEJRQXdnZ0d5TVRnd05nWURWUVFEREM5QkxrTXVJR1JsYkNCVFpYSjJhV05wYnlCa1pTQkJaRzFwYm1semRISmhZMm5EczI0Z1ZISnBZblYwWVhKcFlURXZNQzBHQTFVRUNnd21VMlZ5ZG1samFXOGdaR1VnUVdSdGFXNXBjM1J5WVdOcHc3TnVJRlJ5YVdKMWRHRnlhV0V4T0RBMkJnTlZCQXNNTDBGa2JXbHVhWE4wY21GamFjT3piaUJrWlNCVFpXZDFjbWxrWVdRZ1pHVWdiR0VnU1c1bWIzSnRZV05wdzdOdU1SOHdIUVlKS29aSWh2Y05BUWtCRmhCaFkyOWtjMEJ6WVhRdVoyOWlMbTE0TVNZd0pBWURWUVFKREIxQmRpNGdTR2xrWVd4bmJ5QTNOeXdnUTI5c0xpQkhkV1Z5Y21WeWJ6RU9NQXdHQTFVRUVRd0ZNRFl6TURBeEN6QUpCZ05WQkFZVEFrMVlNUmt3RndZRFZRUUlEQkJFYVhOMGNtbDBieUJHWldSbGNtRnNNUlF3RWdZRFZRUUhEQXREZFdGMWFIVERxVzF2WXpFVk1CTUdBMVVFTFJNTVUwRlVPVGN3TnpBeFRrNHpNVjB3V3dZSktvWklodmNOQVFrQ0RFNVNaWE53YjI1ellXSnNaVG9nUVdSdGFXNXBjM1J5WVdOcHc3TnVJRU5sYm5SeVlXd2daR1VnVTJWeWRtbGphVzl6SUZSeWFXSjFkR0Z5YVc5eklHRnNJRU52Ym5SeWFXSjFlV1Z1ZEdVd0hoY05NVFl4TWpBeU1UazBPREU0V2hjTk1qQXhNakF5TVRrME9ERTRXakNCcVRFWU1CWUdBMVVFQXhNUFJVMVpRMU5CSUZOQklFUkZJRU5XTVJnd0ZnWURWUVFwRXc5RlRWbERVMEVnVTBFZ1JFVWdRMVl4R0RBV0JnTlZCQW9URDBWTldVTlRRU0JUUVNCRVJTQkRWakVsTUNNR0ExVUVMUk1jUlUxWk9EWXhNakU1U2pVNElDOGdSMGxOUVRjeE1EUXdOVVJCTmpFZU1Cd0dBMVVFQlJNVklDOGdSMGxOUVRjeE1EUXdOVWhEU0ZKTVVqQTBNUkl3RUFZRFZRUUxFd2xSVlVWU1JWUkJVazh3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFNaRFY5MkVKUDVWTXRwamUydm5yT1A5S0lQM2pSbTdqOGNXaTdmbjZjdHVhNXhQNTNYZ3htdys2RVl6V1ZwTGNZbWtUNlZzZzhNR3hNQXlWTDVEelRJR0F3NUxpbU5HN0hsOXZSTDhkTHltOGcyQTMxTGVNMDMvRzNkOFJOUVBaSkFGWmNIR2d4dFVoV2RxTFAvNmFUVkVaZ3I3SElRTnBZdGVqalQvajFFdlBPV3N5M3FxdDR1c1c0TUhWNy9VNyt5RnVrMlV0V05nWGlvVkFhTnhWV0E1QWc1OUdrZjlES3V4ZG9SMVkrR3JueFppVmQxZVpZZnladzEybXI3WHROKzBxWTlnWFRDcHBJV0EvVzJSU1kvRzhJcWN2ZkdHRkI5RXNwa3BXbnA4Z1pYMDhCRVJFci9pVnRmajNOaGp0U1JEczIyMHNYVzVNOVgxVFNSeCt2QWdNQkFBR2pIVEFiTUF3R0ExVWRFd0VCL3dRQ01BQXdDd1lEVlIwUEJBUURBZ2JBTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDaGJLRDAreEhURHdoMXNJL09PZlc1MGRjaFk2cTNjL1B6c2NVRUxURGtzYzVra3hFSFNmVi9rRG5NUFNUZnNoK0wwb2NZRDgvQjcyUmtxUGlZZ09FMTBCbnQrUWpWdTEvS1IrUlpkQ0ozTkN1TDYvc0MrWnIrRXJJZXk3K2lSUEcvL0phV0RKNVFxbXBWSjU2bUNkT1BBMm1VK2R1cTdzZWdORWMvOGIxUzdJenhic3NVYWJZVFpkbVJPeDBIL3ZhaDIydmQ1Rjl4T2k5NnZsV0YvZzZqR1NnMVgzeGx6S01rSXZYa0VHdDNMY0I3cTNSNHI5Z29qRWdGWXU0bkx0WERqbmRWSllsdytvVEs3RGdMUDNhbVBWOUlkNm1zdG1DWFVNbmtnSU95bzZ3YVN5R0ZQOWhrb3A2ZmN2dU5rWTZpUWNuVUhVc3BuSnBhRzN3MmJJdmgySG9kZFNkdjVqVTBHNmVsTFVBM1hTTFFQeEtSWkFJWWllVFBEWTZjMHJEMkhoK3JUd2ZJT29yYzdCZmNiRTk0LzR3R29xMEFXdy8yVld2UUIyc3hZMGZ2Z0cvUktFMTZ4R0xGY1JxeTk0TVVuQ3YrdEt6ZkVXVWlUUmNXVUFPRzNMeEhKQWhFaXN3MjFsdGRGcUkwM2F6bTJTMW8vZGgwUGxZWDdVbnc2TkNGSk1KZWJFMXVYbUwrWFFvVVNxdUNjNHBYTEU0N1pqZDdGNDllSXZNdVBtWU1jTWxUb3UvTXY0UjNCdytOQTRLQ1lvcUNqUDBSZThwdHBNQVdZandCY0RDSGpMN3hEdGxKYWQ5Mk8wZXkvTEtBZjFid0VuMy9pQ2ZlMnpQTys5ckg4VlQwSm5iQm94bGdKL3VzelVPbXdaTHRjajB6ZVEwbFpBK2E4YUcwb2c9PSIgY29uZGljaW9uZXNEZVBhZ289IkNSRURJVE8iIHN1YlRvdGFsPSIxNDE1NzAwLjAwIiBkZXNjdWVudG89IjAuMDAiIG1vdGl2b0Rlc2N1ZW50bz0iWCIgVGlwb0NhbWJpbz0iMS4wMDAiIE1vbmVkYT0iUGVzb3MiIHRvdGFsPSIxNjQyMjEyLjAwIiB0aXBvRGVDb21wcm9iYW50ZT0iaW5ncmVzbyIgbWV0b2RvRGVQYWdvPSIwMyIgTHVnYXJFeHBlZGljaW9uPSJFbCBNYXJxdcOpcyxRVUVSRVRBUk8iIE51bUN0YVBhZ289IjU0OTEiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zYXQuZ29iLm14L2NmZC8zIGh0dHA6Ly93d3cuc2F0LmdvYi5teC9zaXRpb19pbnRlcm5ldC9jZmQvMy9jZmR2MzIueHNkIiB4bWxuczpjZmRpPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvY2ZkLzMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPjxjZmRpOkVtaXNvciByZmM9IkVNWTg2MTIxOUo1OCIgbm9tYnJlPSJFTVlDU0EgUy5BLiAgREUgQy5WLiI+PGNmZGk6RG9taWNpbGlvRmlzY2FsIGNhbGxlPSJLTSAyMDcgTUFTIDcwMCBDQVJSRVRFUkEgQSBERUxJQ0lBUyAiIG5vRXh0ZXJpb3I9IlNOIiBjb2xvbmlhPSJBcXVpbGVzIFNlcmTDoW4iIGxvY2FsaWRhZD0iQ0hJSFVBSFVBIiBtdW5pY2lwaW89IkFxdWlsZXMgU2VyZMOhbiIgZXN0YWRvPSJDSElIVUFIVUEiIHBhaXM9Ik1FWElDTyIgY29kaWdvUG9zdGFsPSIzMTY1MCIgLz48Y2ZkaTpFeHBlZGlkb0VuIGNhbGxlPSJFTCBURVBFWUFDIiBub0V4dGVyaW9yPSIxMTA5MCIgY29sb25pYT0iRWwgVGVwZXlhYyIgbXVuaWNpcGlvPSJFbCBNYXJxdcOpcyIgZXN0YWRvPSJRVUVSRVRBUk8iIHBhaXM9Ik1FWElDTyIgY29kaWdvUG9zdGFsPSI3NjI1MCIgLz48Y2ZkaTpSZWdpbWVuRmlzY2FsIFJlZ2ltZW49IlJFR0lNRU4gR0VORVJBTCBERSBQRVJTT05BUyBNT1JBTEVTIiAvPjwvY2ZkaTpFbWlzb3I+PGNmZGk6UmVjZXB0b3IgcmZjPSJDQ1U5MTA4MDVDUDgiIG5vbWJyZT0iQ09OU1RSVUNUT1JBIENIVUZBTkkgU0EgREUgQ1YiPjxjZmRpOkRvbWljaWxpbyBjYWxsZT0iQ0lSQ1VJVE8gUEFMTUEgQ09DT1RFUkEiIG5vRXh0ZXJpb3I9IjIwMjAiIGNvbG9uaWE9IlBBTE1BUkVTIERFIFFVRVJFVEFSTyIgbG9jYWxpZGFkPSJRVUVSRVRBUk8iIG11bmljaXBpbz0iUXVlcsOpdGFybyIgZXN0YWRvPSJRVUVSRVRBUk8iIHBhaXM9Ik1FWElDTyIgY29kaWdvUG9zdGFsPSI3NjEyNyIgLz48L2NmZGk6UmVjZXB0b3I+PGNmZGk6Q29uY2VwdG9zPjxjZmRpOkNvbmNlcHRvIGNhbnRpZGFkPSIxIiB1bmlkYWQ9Ik5PIEFQTElDQSIgZGVzY3JpcGNpb249IkVTVElNQUNJT04gTk8uIDUiIHZhbG9yVW5pdGFyaW89IjIxNzgwMDAuMDAiIGltcG9ydGU9IjIxNzgwMDAuMDAiIC8+PGNmZGk6Q29uY2VwdG8gY2FudGlkYWQ9IjEiIHVuaWRhZD0iTk8gQVBMSUNBIiBkZXNjcmlwY2lvbj0iMjUlIEFNT1JUSVpBQ0lPTiBERSBBTlRJQ0lQTyIgdmFsb3JVbml0YXJpbz0iLTU0NDUwMC4wMCIgaW1wb3J0ZT0iLTU0NDUwMC4wMCIgLz48Y2ZkaTpDb25jZXB0byBjYW50aWRhZD0iMSIgdW5pZGFkPSJOTyBBUExJQ0EiIGRlc2NyaXBjaW9uPSIxMCUgRk9ORE8gREUgR0FSQU5USUEmI3hEOyYjeEE7UE9SIExPUyBUUkFCQUpPUyBERSBTVU1JTklTVFJPLCBGQUJSSUNBQ0lPTiBZIE1PTlRBSkUmI3hBO0RFIEVTVFJVQ1RVUkEgWSBDVUJJRVJUQSBNRVRBTElDQS4mI3hBO0NPTlRSQVRPOiAyMDE3LTEwODUtMjIzMjQuJiN4QTtQUk9WRUVET1I6IDEyNS4mI3hBO1BFRElETzogNDUwMDAyMjMyNC4mI3hBO0VOVFJBREE6IDEwMDAxMTQ1NDEuJiN4QTsmI3hBO0RFIExBIE9CUkE6IE5ISyBTUFJJTkcgTUVYSUNPLiYjeEE7VUJJQ0FEQSBFTjogSVJBUFVBVE8sIEdUTy4iIHZhbG9yVW5pdGFyaW89Ii0yMTc4MDAuMDAiIGltcG9ydGU9Ii0yMTc4MDAuMDAiIC8+PC9jZmRpOkNvbmNlcHRvcz48Y2ZkaTpJbXB1ZXN0b3MgdG90YWxJbXB1ZXN0b3NSZXRlbmlkb3M9IjAuMDAiIHRvdGFsSW1wdWVzdG9zVHJhc2xhZGFkb3M9IjIyNjUxMiI+PGNmZGk6UmV0ZW5jaW9uZXM+PGNmZGk6UmV0ZW5jaW9uIGltcHVlc3RvPSJJU1IiIGltcG9ydGU9IjAuMDAiIC8+PGNmZGk6UmV0ZW5jaW9uIGltcHVlc3RvPSJJVkEiIGltcG9ydGU9IjAuMDAiIC8+PC9jZmRpOlJldGVuY2lvbmVzPjxjZmRpOlRyYXNsYWRvcz48Y2ZkaTpUcmFzbGFkbyBpbXB1ZXN0bz0iSVZBIiB0YXNhPSIxNiIgaW1wb3J0ZT0iMjI2NTEyIiAvPjxjZmRpOlRyYXNsYWRvIGltcHVlc3RvPSJJRVBTIiB0YXNhPSIwIiBpbXBvcnRlPSIwIiAvPjwvY2ZkaTpUcmFzbGFkb3M+PC9jZmRpOkltcHVlc3Rvcz48Y2ZkaTpDb21wbGVtZW50bz48dGZkOlRpbWJyZUZpc2NhbERpZ2l0YWwgdmVyc2lvbj0iMS4wIiBVVUlEPSJmM2YzYTg1Ni04YTQ3LTRmYzYtYmM4OS1hNzExYzM2ODgxMDUiIEZlY2hhVGltYnJhZG89IjIwMTctMTEtMDhUMTQ6MDM6NDMiIHNlbGxvQ0ZEPSJENjNnb2IrWW1GcFh5SllKUGJkS2JKQ0t2VU1vTTZnRWFCL2V1djJya21hMFJIMTV5RlYvUENvUzE4ZjRyeEk5VEtYa3k3cUFtaXZGSktGVGJaUnVWMytZbVZzbExucW5NNW9wZjhrRktINlBNempQVUd1Kzh4U04xaWUrVlVBcTQ5SVNXeWw2VEdiVktOY0NvTXdITXR0dGsrK09WOEVxVEUzS25SZlQ3cUJROHdTWW0rK0tDL0JLYXd5dEdHZUpRcVZzU2pqTTdzUWpUMVpNMzZFRVc0RG1FQm83UVV2UDEybnRHY3IzSWJLOTAzNmRqN3VGYmN5NWVXYWJJS0VoeWFyV3NoWFFpWDJlOXJMQ3NXSEg0emxqNFFxWTZwU1k3aGlQY0hzT2Q4djFseWdUWWlLbExvdmpzZTkwY2VndUNmMkFyNjBoUk54Q2tBbTVRc2ZwV0E9PSIgbm9DZXJ0aWZpY2Fkb1NBVD0iMDAwMDEwMDAwMDA0MDc5MDg3NDMiIHNlbGxvU0FUPSJ1QVg1RnFsVVduVHFSQlFtK2o5OU5vbnhyTDVZU3pLRS9vYkMzZURmaE8xd1VraUZsSm9vdEJXc2R1dHlLZEJpYkxOUmpzZFM0U3FNTnpINm9jTWpBbEIzVGRybGttYTA5MWY1eFM3dkVTZlZKTW5oN0hjdWpxN25sd05tcEZ0NlBaNnJXZFlhNWdKNlVFeDU1dEYwMU4zcDlWYllvNWxKSDBVU0lhcXJiK2ZiMmhCMFl6Z201L0M5Yy8vaW9zNFRRTUt3L3FaY1Q4N2MwczZNWVQ0eUlITitOUm81Zy80RmJDR2NqZllzRDEyaWwzbWFrWWp1R0p4YVhXVTJvblluTUlVdkorSm5odlF2UjZzTnM0SWZwMUI3WTRvSHNNNUlmeHgwUkNZa0JSbkFhNkc5N0lxdi9hTFFFT08wcFE0c0lEakVFU0tUMWFrNnRUZjliaWlBUVE9PSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvVGltYnJlRmlzY2FsRGlnaXRhbCBodHRwOi8vd3d3LnNhdC5nb2IubXgvVGltYnJlRmlzY2FsRGlnaXRhbC9UaW1icmVGaXNjYWxEaWdpdGFsLnhzZCIgeG1sbnM6dGZkPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvVGltYnJlRmlzY2FsRGlnaXRhbCIgLz48L2NmZGk6Q29tcGxlbWVudG8+PC9jZmRpOkNvbXByb2JhbnRlPg==

Result in jruby 1.3

PGNmZGk6Q29tcHJvYmFudGUgdmVyc2lvbj0iMy4yIiBzZXJpZT0iUSIgZm9saW89IjI2NzQiIGZlY2hhPSIyMDE3LTExLTA4VDEzOjAzOjM0IiBzZWxsbz0iRDYzZ29iK1ltRnBYeUpZSlBiZEtiSkNLdlVNb002Z0VhQi9ldXYycmttYTBSSDE1eUZWL1BDb1MxOGY0cnhJOVRLWGt5N3FBbWl2RkpLRlRiWlJ1VjMrWW1Wc2xMbnFuTTVvcGY4a0ZLSDZQTXpqUFVHdSs4eFNOMWllK1ZVQXE0OUlTV3lsNlRHYlZLTmNDb013SE10dHRrKytPVjhFcVRFM0tuUmZUN3FCUTh3U1ltKytLQy9CS2F3eXRHR2VKUXFWc1Nqak03c1FqVDFaTTM2RUVXNERtRUJvN1FVdlAxMm50R2NyM0liSzkwMzZkajd1RmJjeTVlV2FiSUtFaHlhcldzaFhRaVgyZTlyTENzV0hINHpsajRRcVk2cFNZN2hpUGNIc09kOHYxbHlnVFlpS2xMb3Zqc2U5MGNlZ3VDZjJBcjYwaFJOeENrQW01UXNmcFdBPT0iIGZvcm1hRGVQYWdvPSJwYWdvIGVuIHVuYSBzb2xhIGV4aGliaWNpb24iIG5vQ2VydGlmaWNhZG89IjAwMDAxMDAwMDAwNDA0NDQyMTk1IiBjZXJ0aWZpY2Fkbz0iTUlJR0NUQ0NBL0dnQXdJQkFnSVVNREF3TURFd01EQXdNREEwTURRME5ESXhPVFV3RFFZSktvWklodmNOQVFFTEJRQXdnZ0d5TVRnd05nWURWUVFEREM5QkxrTXVJR1JsYkNCVFpYSjJhV05wYnlCa1pTQkJaRzFwYm1semRISmhZMm5EczI0Z1ZISnBZblYwWVhKcFlURXZNQzBHQTFVRUNnd21VMlZ5ZG1samFXOGdaR1VnUVdSdGFXNXBjM1J5WVdOcHc3TnVJRlJ5YVdKMWRHRnlhV0V4T0RBMkJnTlZCQXNNTDBGa2JXbHVhWE4wY21GamFjT3piaUJrWlNCVFpXZDFjbWxrWVdRZ1pHVWdiR0VnU1c1bWIzSnRZV05wdzdOdU1SOHdIUVlKS29aSWh2Y05BUWtCRmhCaFkyOWtjMEJ6WVhRdVoyOWlMbTE0TVNZd0pBWURWUVFKREIxQmRpNGdTR2xrWVd4bmJ5QTNOeXdnUTI5c0xpQkhkV1Z5Y21WeWJ6RU9NQXdHQTFVRUVRd0ZNRFl6TURBeEN6QUpCZ05WQkFZVEFrMVlNUmt3RndZRFZRUUlEQkJFYVhOMGNtbDBieUJHWldSbGNtRnNNUlF3RWdZRFZRUUhEQXREZFdGMWFIVERxVzF2WXpFVk1CTUdBMVVFTFJNTVUwRlVPVGN3TnpBeFRrNHpNVjB3V3dZSktvWklodmNOQVFrQ0RFNVNaWE53YjI1ellXSnNaVG9nUVdSdGFXNXBjM1J5WVdOcHc3TnVJRU5sYm5SeVlXd2daR1VnVTJWeWRtbGphVzl6SUZSeWFXSjFkR0Z5YVc5eklHRnNJRU52Ym5SeWFXSjFlV1Z1ZEdVd0hoY05NVFl4TWpBeU1UazBPREU0V2hjTk1qQXhNakF5TVRrME9ERTRXakNCcVRFWU1CWUdBMVVFQXhNUFJVMVpRMU5CSUZOQklFUkZJRU5XTVJnd0ZnWURWUVFwRXc5RlRWbERVMEVnVTBFZ1JFVWdRMVl4R0RBV0JnTlZCQW9URDBWTldVTlRRU0JUUVNCRVJTQkRWakVsTUNNR0ExVUVMUk1jUlUxWk9EWXhNakU1U2pVNElDOGdSMGxOUVRjeE1EUXdOVVJCTmpFZU1Cd0dBMVVFQlJNVklDOGdSMGxOUVRjeE1EUXdOVWhEU0ZKTVVqQTBNUkl3RUFZRFZRUUxFd2xSVlVWU1JWUkJVazh3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFNaRFY5MkVKUDVWTXRwamUydm5yT1A5S0lQM2pSbTdqOGNXaTdmbjZjdHVhNXhQNTNYZ3htdys2RVl6V1ZwTGNZbWtUNlZzZzhNR3hNQXlWTDVEelRJR0F3NUxpbU5HN0hsOXZSTDhkTHltOGcyQTMxTGVNMDMvRzNkOFJOUVBaSkFGWmNIR2d4dFVoV2RxTFAvNmFUVkVaZ3I3SElRTnBZdGVqalQvajFFdlBPV3N5M3FxdDR1c1c0TUhWNy9VNyt5RnVrMlV0V05nWGlvVkFhTnhWV0E1QWc1OUdrZjlES3V4ZG9SMVkrR3JueFppVmQxZVpZZnladzEybXI3WHROKzBxWTlnWFRDcHBJV0EvVzJSU1kvRzhJcWN2ZkdHRkI5RXNwa3BXbnA4Z1pYMDhCRVJFci9pVnRmajNOaGp0U1JEczIyMHNYVzVNOVgxVFNSeCt2QWdNQkFBR2pIVEFiTUF3R0ExVWRFd0VCL3dRQ01BQXdDd1lEVlIwUEJBUURBZ2JBTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDaGJLRDAreEhURHdoMXNJL09PZlc1MGRjaFk2cTNjL1B6c2NVRUxURGtzYzVra3hFSFNmVi9rRG5NUFNUZnNoK0wwb2NZRDgvQjcyUmtxUGlZZ09FMTBCbnQrUWpWdTEvS1IrUlpkQ0ozTkN1TDYvc0MrWnIrRXJJZXk3K2lSUEcvL0phV0RKNVFxbXBWSjU2bUNkT1BBMm1VK2R1cTdzZWdORWMvOGIxUzdJenhic3NVYWJZVFpkbVJPeDBIL3ZhaDIydmQ1Rjl4T2k5NnZsV0YvZzZqR1NnMVgzeGx6S01rSXZYa0VHdDNMY0I3cTNSNHI5Z29qRWdGWXU0bkx0WERqbmRWSllsdytvVEs3RGdMUDNhbVBWOUlkNm1zdG1DWFVNbmtnSU95bzZ3YVN5R0ZQOWhrb3A2ZmN2dU5rWTZpUWNuVUhVc3BuSnBhRzN3MmJJdmgySG9kZFNkdjVqVTBHNmVsTFVBM1hTTFFQeEtSWkFJWWllVFBEWTZjMHJEMkhoK3JUd2ZJT29yYzdCZmNiRTk0LzR3R29xMEFXdy8yVld2UUIyc3hZMGZ2Z0cvUktFMTZ4R0xGY1JxeTk0TVVuQ3YrdEt6ZkVXVWlUUmNXVUFPRzNMeEhKQWhFaXN3MjFsdGRGcUkwM2F6bTJTMW8vZGgwUGxZWDdVbnc2TkNGSk1KZWJFMXVYbUwrWFFvVVNxdUNjNHBYTEU0N1pqZDdGNDllSXZNdVBtWU1jTWxUb3UvTXY0UjNCdytOQTRLQ1lvcUNqUDBSZThwdHBNQVdZandCY0RDSGpMN3hEdGxKYWQ5Mk8wZXkvTEtBZjFid0VuMy9pQ2ZlMnpQTys5ckg4VlQwSm5iQm94bGdKL3VzelVPbXdaTHRjajB6ZVEwbFpBK2E4YUcwb2c9PSIgY29uZGljaW9uZXNEZVBhZ289IkNSRURJVE8iIHN1YlRvdGFsPSIxNDE1NzAwLjAwIiBkZXNjdWVudG89IjAuMDAiIG1vdGl2b0Rlc2N1ZW50bz0iWCIgVGlwb0NhbWJpbz0iMS4wMDAiIE1vbmVkYT0iUGVzb3MiIHRvdGFsPSIxNjQyMjEyLjAwIiB0aXBvRGVDb21wcm9iYW50ZT0iaW5ncmVzbyIgbWV0b2RvRGVQYWdvPSIwMyIgTHVnYXJFeHBlZGljaW9uPSJFbCBNYXJxdelzLFFVRVJFVEFSTyIgTnVtQ3RhUGFnbz0iNTQ5MSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvY2ZkLzMgaHR0cDovL3d3dy5zYXQuZ29iLm14L3NpdGlvX2ludGVybmV0L2NmZC8zL2NmZHYzMi54c2QiIHhtbG5zOmNmZGk9Imh0dHA6Ly93d3cuc2F0LmdvYi5teC9jZmQvMyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PGNmZGk6RW1pc29yIHJmYz0iRU1ZODYxMjE5SjU4IiBub21icmU9IkVNWUNTQSBTLkEuICBERSBDLlYuIj48Y2ZkaTpEb21pY2lsaW9GaXNjYWwgY2FsbGU9IktNIDIwNyBNQVMgNzAwIENBUlJFVEVSQSBBIERFTElDSUFTICIgbm9FeHRlcmlvcj0iU04iIGNvbG9uaWE9IkFxdWlsZXMgU2VyZOFuIiBsb2NhbGlkYWQ9IkNISUhVQUhVQSIgbXVuaWNpcGlvPSJBcXVpbGVzIFNlcmThbiIgZXN0YWRvPSJDSElIVUFIVUEiIHBhaXM9Ik1FWElDTyIgY29kaWdvUG9zdGFsPSIzMTY1MCIgLz48Y2ZkaTpFeHBlZGlkb0VuIGNhbGxlPSJFTCBURVBFWUFDIiBub0V4dGVyaW9yPSIxMTA5MCIgY29sb25pYT0iRWwgVGVwZXlhYyIgbXVuaWNpcGlvPSJFbCBNYXJxdelzIiBlc3RhZG89IlFVRVJFVEFSTyIgcGFpcz0iTUVYSUNPIiBjb2RpZ29Qb3N0YWw9Ijc2MjUwIiAvPjxjZmRpOlJlZ2ltZW5GaXNjYWwgUmVnaW1lbj0iUkVHSU1FTiBHRU5FUkFMIERFIFBFUlNPTkFTIE1PUkFMRVMiIC8+PC9jZmRpOkVtaXNvcj48Y2ZkaTpSZWNlcHRvciByZmM9IkNDVTkxMDgwNUNQOCIgbm9tYnJlPSJDT05TVFJVQ1RPUkEgQ0hVRkFOSSBTQSBERSBDViI+PGNmZGk6RG9taWNpbGlvIGNhbGxlPSJDSVJDVUlUTyBQQUxNQSBDT0NPVEVSQSIgbm9FeHRlcmlvcj0iMjAyMCIgY29sb25pYT0iUEFMTUFSRVMgREUgUVVFUkVUQVJPIiBsb2NhbGlkYWQ9IlFVRVJFVEFSTyIgbXVuaWNpcGlvPSJRdWVy6XRhcm8iIGVzdGFkbz0iUVVFUkVUQVJPIiBwYWlzPSJNRVhJQ08iIGNvZGlnb1Bvc3RhbD0iNzYxMjciIC8+PC9jZmRpOlJlY2VwdG9yPjxjZmRpOkNvbmNlcHRvcz48Y2ZkaTpDb25jZXB0byBjYW50aWRhZD0iMSIgdW5pZGFkPSJOTyBBUExJQ0EiIGRlc2NyaXBjaW9uPSJFU1RJTUFDSU9OIE5PLiA1IiB2YWxvclVuaXRhcmlvPSIyMTc4MDAwLjAwIiBpbXBvcnRlPSIyMTc4MDAwLjAwIiAvPjxjZmRpOkNvbmNlcHRvIGNhbnRpZGFkPSIxIiB1bmlkYWQ9Ik5PIEFQTElDQSIgZGVzY3JpcGNpb249IjI1JSBBTU9SVElaQUNJT04gREUgQU5USUNJUE8iIHZhbG9yVW5pdGFyaW89Ii01NDQ1MDAuMDAiIGltcG9ydGU9Ii01NDQ1MDAuMDAiIC8+PGNmZGk6Q29uY2VwdG8gY2FudGlkYWQ9IjEiIHVuaWRhZD0iTk8gQVBMSUNBIiBkZXNjcmlwY2lvbj0iMTAlIEZPTkRPIERFIEdBUkFOVElBJiN4RDsmI3hBO1BPUiBMT1MgVFJBQkFKT1MgREUgU1VNSU5JU1RSTywgRkFCUklDQUNJT04gWSBNT05UQUpFJiN4QTtERSBFU1RSVUNUVVJBIFkgQ1VCSUVSVEEgTUVUQUxJQ0EuJiN4QTtDT05UUkFUTzogMjAxNy0xMDg1LTIyMzI0LiYjeEE7UFJPVkVFRE9SOiAxMjUuJiN4QTtQRURJRE86IDQ1MDAwMjIzMjQuJiN4QTtFTlRSQURBOiAxMDAwMTE0NTQxLiYjeEE7JiN4QTtERSBMQSBPQlJBOiBOSEsgU1BSSU5HIE1FWElDTy4mI3hBO1VCSUNBREEgRU46IElSQVBVQVRPLCBHVE8uIiB2YWxvclVuaXRhcmlvPSItMjE3ODAwLjAwIiBpbXBvcnRlPSItMjE3ODAwLjAwIiAvPjwvY2ZkaTpDb25jZXB0b3M+PGNmZGk6SW1wdWVzdG9zIHRvdGFsSW1wdWVzdG9zUmV0ZW5pZG9zPSIwLjAwIiB0b3RhbEltcHVlc3Rvc1RyYXNsYWRhZG9zPSIyMjY1MTIiPjxjZmRpOlJldGVuY2lvbmVzPjxjZmRpOlJldGVuY2lvbiBpbXB1ZXN0bz0iSVNSIiBpbXBvcnRlPSIwLjAwIiAvPjxjZmRpOlJldGVuY2lvbiBpbXB1ZXN0bz0iSVZBIiBpbXBvcnRlPSIwLjAwIiAvPjwvY2ZkaTpSZXRlbmNpb25lcz48Y2ZkaTpUcmFzbGFkb3M+PGNmZGk6VHJhc2xhZG8gaW1wdWVzdG89IklWQSIgdGFzYT0iMTYiIGltcG9ydGU9IjIyNjUxMiIgLz48Y2ZkaTpUcmFzbGFkbyBpbXB1ZXN0bz0iSUVQUyIgdGFzYT0iMCIgaW1wb3J0ZT0iMCIgLz48L2NmZGk6VHJhc2xhZG9zPjwvY2ZkaTpJbXB1ZXN0b3M+PGNmZGk6Q29tcGxlbWVudG8+PHRmZDpUaW1icmVGaXNjYWxEaWdpdGFsIHZlcnNpb249IjEuMCIgVVVJRD0iZjNmM2E4NTYtOGE0Ny00ZmM2LWJjODktYTcxMWMzNjg4MTA1IiBGZWNoYVRpbWJyYWRvPSIyMDE3LTExLTA4VDE0OjAzOjQzIiBzZWxsb0NGRD0iRDYzZ29iK1ltRnBYeUpZSlBiZEtiSkNLdlVNb002Z0VhQi9ldXYycmttYTBSSDE1eUZWL1BDb1MxOGY0cnhJOVRLWGt5N3FBbWl2RkpLRlRiWlJ1VjMrWW1Wc2xMbnFuTTVvcGY4a0ZLSDZQTXpqUFVHdSs4eFNOMWllK1ZVQXE0OUlTV3lsNlRHYlZLTmNDb013SE10dHRrKytPVjhFcVRFM0tuUmZUN3FCUTh3U1ltKytLQy9CS2F3eXRHR2VKUXFWc1Nqak03c1FqVDFaTTM2RUVXNERtRUJvN1FVdlAxMm50R2NyM0liSzkwMzZkajd1RmJjeTVlV2FiSUtFaHlhcldzaFhRaVgyZTlyTENzV0hINHpsajRRcVk2cFNZN2hpUGNIc09kOHYxbHlnVFlpS2xMb3Zqc2U5MGNlZ3VDZjJBcjYwaFJOeENrQW01UXNmcFdBPT0iIG5vQ2VydGlmaWNhZG9TQVQ9IjAwMDAxMDAwMDAwNDA3OTA4NzQzIiBzZWxsb1NBVD0idUFYNUZxbFVXblRxUkJRbStqOTlOb254ckw1WVN6S0Uvb2JDM2VEZmhPMXdVa2lGbEpvb3RCV3NkdXR5S2RCaWJMTlJqc2RTNFNxTU56SDZvY01qQWxCM1RkcmxrbWEwOTFmNXhTN3ZFU2ZWSk1uaDdIY3VqcTdubHdObXBGdDZQWjZyV2RZYTVnSjZVRXg1NXRGMDFOM3A5VmJZbzVsSkgwVVNJYXFyYitmYjJoQjBZemdtNS9DOWMvL2lvczRUUU1Ldy9xWmNUODdjMHM2TVlUNHlJSE4rTlJvNWcvNEZiQ0djamZZc0QxMmlsM21ha1lqdUdKeGFYV1Uyb25Zbk1JVXZKK0puaHZRdlI2c05zNElmcDFCN1k0b0hzTTVJZnh4MFJDWWtCUm5BYTZHOTdJcXYvYUxRRU9PMHBRNHNJRGpFRVNLVDFhazZ0VGY5YmlpQVFRPT0iIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zYXQuZ29iLm14L1RpbWJyZUZpc2NhbERpZ2l0YWwgaHR0cDovL3d3dy5zYXQuZ29iLm14L1RpbWJyZUZpc2NhbERpZ2l0YWwvVGltYnJlRmlzY2FsRGlnaXRhbC54c2QiIHhtbG5zOnRmZD0iaHR0cDovL3d3dy5zYXQuZ29iLm14L1RpbWJyZUZpc2NhbERpZ2l0YWwiIC8+PC9jZmRpOkNvbXBsZW1lbnRvPjwvY2ZkaTpDb21wcm9iYW50ZT4=

original string

cfdi = '<cfdi:Comprobante version="3.2" serie="Q" folio="2674" fecha="2017-11-08T13:03:34" sello="D63gob+YmFpXyJYJPbdKbJCKvUMoM6gEaB/euv2rkma0RH15yFV/PCoS18f4rxI9TKXky7qAmivFJKFTbZRuV3+YmVslLnqnM5opf8kFKH6PMzjPUGu+8xSN1ie+VUAq49ISWyl6TGbVKNcCoMwHMtttk++OV8EqTE3KnRfT7qBQ8wSYm++KC/BKawytGGeJQqVsSjjM7sQjT1ZM36EEW4DmEBo7QUvP12ntGcr3IbK9036dj7uFbcy5eWabIKEhyarWshXQiX2e9rLCsWHH4zlj4QqY6pSY7hiPcHsOd8v1lygTYiKlLovjse90ceguCf2Ar60hRNxCkAm5QsfpWA==" formaDePago="pago en una sola exhibicion" noCertificado="00001000000404442195" certificado="MIIGCTCCA/GgAwIBAgIUMDAwMDEwMDAwMDA0MDQ0NDIxOTUwDQYJKoZIhvcNAQELBQAwggGyMTgwNgYDVQQDDC9BLkMuIGRlbCBTZXJ2aWNpbyBkZSBBZG1pbmlzdHJhY2nDs24gVHJpYnV0YXJpYTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMR8wHQYJKoZIhvcNAQkBFhBhY29kc0BzYXQuZ29iLm14MSYwJAYDVQQJDB1Bdi4gSGlkYWxnbyA3NywgQ29sLiBHdWVycmVybzEOMAwGA1UEEQwFMDYzMDAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBEaXN0cml0byBGZWRlcmFsMRQwEgYDVQQHDAtDdWF1aHTDqW1vYzEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMV0wWwYJKoZIhvcNAQkCDE5SZXNwb25zYWJsZTogQWRtaW5pc3RyYWNpw7NuIENlbnRyYWwgZGUgU2VydmljaW9zIFRyaWJ1dGFyaW9zIGFsIENvbnRyaWJ1eWVudGUwHhcNMTYxMjAyMTk0ODE4WhcNMjAxMjAyMTk0ODE4WjCBqTEYMBYGA1UEAxMPRU1ZQ1NBIFNBIERFIENWMRgwFgYDVQQpEw9FTVlDU0EgU0EgREUgQ1YxGDAWBgNVBAoTD0VNWUNTQSBTQSBERSBDVjElMCMGA1UELRMcRU1ZODYxMjE5SjU4IC8gR0lNQTcxMDQwNURBNjEeMBwGA1UEBRMVIC8gR0lNQTcxMDQwNUhDSFJMUjA0MRIwEAYDVQQLEwlRVUVSRVRBUk8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSZDV92EJP5VMtpje2vnrOP9KIP3jRm7j8cWi7fn6ctua5xP53Xgxmw+6EYzWVpLcYmkT6Vsg8MGxMAyVL5DzTIGAw5LimNG7Hl9vRL8dLym8g2A31LeM03/G3d8RNQPZJAFZcHGgxtUhWdqLP/6aTVEZgr7HIQNpYtejjT/j1EvPOWsy3qqt4usW4MHV7/U7+yFuk2UtWNgXioVAaNxVWA5Ag59Gkf9DKuxdoR1Y+GrnxZiVd1eZYfyZw12mr7XtN+0qY9gXTCppIWA/W2RSY/G8IqcvfGGFB9EspkpWnp8gZX08BEREr/iVtfj3NhjtSRDs220sXW5M9X1TSRx+vAgMBAAGjHTAbMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMA0GCSqGSIb3DQEBCwUAA4ICAQChbKD0+xHTDwh1sI/OOfW50dchY6q3c/PzscUELTDksc5kkxEHSfV/kDnMPSTfsh+L0ocYD8/B72RkqPiYgOE10Bnt+QjVu1/KR+RZdCJ3NCuL6/sC+Zr+ErIey7+iRPG//JaWDJ5QqmpVJ56mCdOPA2mU+duq7segNEc/8b1S7IzxbssUabYTZdmROx0H/vah22vd5F9xOi96vlWF/g6jGSg1X3xlzKMkIvXkEGt3LcB7q3R4r9gojEgFYu4nLtXDjndVJYlw+oTK7DgLP3amPV9Id6mstmCXUMnkgIOyo6waSyGFP9hkop6fcvuNkY6iQcnUHUspnJpaG3w2bIvh2HoddSdv5jU0G6elLUA3XSLQPxKRZAIYieTPDY6c0rD2Hh+rTwfIOorc7BfcbE94/4wGoq0AWw/2VWvQB2sxY0fvgG/RKE16xGLFcRqy94MUnCv+tKzfEWUiTRcWUAOG3LxHJAhEisw21ltdFqI03azm2S1o/dh0PlYX7Unw6NCFJMJebE1uXmL+XQoUSquCc4pXLE47Zjd7F49eIvMuPmYMcMlTou/Mv4R3Bw+NA4KCYoqCjP0Re8ptpMAWYjwBcDCHjL7xDtlJad92O0ey/LKAf1bwEn3/iCfe2zPO+9rH8VT0JnbBoxlgJ/uszUOmwZLtcj0zeQ0lZA+a8aG0og==" condicionesDePago="CREDITO" subTotal="1415700.00" descuento="0.00" motivoDescuento="X" TipoCambio="1.000" Moneda="Pesos" total="1642212.00" tipoDeComprobante="ingreso" metodoDePago="03" LugarExpedicion="El Marqués,QUERETARO" NumCtaPago="5491" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><cfdi:Emisor rfc="EMY861219J58" nombre="EMYCSA S.A.  DE C.V."><cfdi:DomicilioFiscal calle="KM 207 MAS 700 CARRETERA A DELICIAS " noExterior="SN" colonia="Aquiles Serdán" localidad="CHIHUAHUA" municipio="Aquiles Serdán" estado="CHIHUAHUA" pais="MEXICO" codigoPostal="31650" /><cfdi:ExpedidoEn calle="EL TEPEYAC" noExterior="11090" colonia="El Tepeyac" municipio="El Marqués" estado="QUERETARO" pais="MEXICO" codigoPostal="76250" /><cfdi:RegimenFiscal Regimen="REGIMEN GENERAL DE PERSONAS MORALES" /></cfdi:Emisor><cfdi:Receptor rfc="CCU910805CP8" nombre="CONSTRUCTORA CHUFANI SA DE CV"><cfdi:Domicilio calle="CIRCUITO PALMA COCOTERA" noExterior="2020" colonia="PALMARES DE QUERETARO" localidad="QUERETARO" municipio="Querétaro" estado="QUERETARO" pais="MEXICO" codigoPostal="76127" /></cfdi:Receptor><cfdi:Conceptos><cfdi:Concepto cantidad="1" unidad="NO APLICA" descripcion="ESTIMACION NO. 5" valorUnitario="2178000.00" importe="2178000.00" /><cfdi:Concepto cantidad="1" unidad="NO APLICA" descripcion="25% AMORTIZACION DE ANTICIPO" valorUnitario="-544500.00" importe="-544500.00" /><cfdi:Concepto cantidad="1" unidad="NO APLICA" descripcion="10% FONDO DE GARANTIA&#xD;&#xA;POR LOS TRABAJOS DE SUMINISTRO, FABRICACION Y MONTAJE&#xA;DE ESTRUCTURA Y CUBIERTA METALICA.&#xA;CONTRATO: 2017-1085-22324.&#xA;PROVEEDOR: 125.&#xA;PEDIDO: 4500022324.&#xA;ENTRADA: 1000114541.&#xA;&#xA;DE LA OBRA: NHK SPRING MEXICO.&#xA;UBICADA EN: IRAPUATO, GTO." valorUnitario="-217800.00" importe="-217800.00" /></cfdi:Conceptos><cfdi:Impuestos totalImpuestosRetenidos="0.00" totalImpuestosTrasladados="226512"><cfdi:Retenciones><cfdi:Retencion impuesto="ISR" importe="0.00" /><cfdi:Retencion impuesto="IVA" importe="0.00" /></cfdi:Retenciones><cfdi:Traslados><cfdi:Traslado impuesto="IVA" tasa="16" importe="226512" /><cfdi:Traslado impuesto="IEPS" tasa="0" importe="0" /></cfdi:Traslados></cfdi:Impuestos><cfdi:Complemento><tfd:TimbreFiscalDigital version="1.0" UUID="f3f3a856-8a47-4fc6-bc89-a711c3688105" FechaTimbrado="2017-11-08T14:03:43" selloCFD="D63gob+YmFpXyJYJPbdKbJCKvUMoM6gEaB/euv2rkma0RH15yFV/PCoS18f4rxI9TKXky7qAmivFJKFTbZRuV3+YmVslLnqnM5opf8kFKH6PMzjPUGu+8xSN1ie+VUAq49ISWyl6TGbVKNcCoMwHMtttk++OV8EqTE3KnRfT7qBQ8wSYm++KC/BKawytGGeJQqVsSjjM7sQjT1ZM36EEW4DmEBo7QUvP12ntGcr3IbK9036dj7uFbcy5eWabIKEhyarWshXQiX2e9rLCsWHH4zlj4QqY6pSY7hiPcHsOd8v1lygTYiKlLovjse90ceguCf2Ar60hRNxCkAm5QsfpWA==" noCertificadoSAT="00001000000407908743" selloSAT="uAX5FqlUWnTqRBQm+j99NonxrL5YSzKE/obC3eDfhO1wUkiFlJootBWsdutyKdBibLNRjsdS4SqMNzH6ocMjAlB3Tdrlkma091f5xS7vESfVJMnh7Hcujq7nlwNmpFt6PZ6rWdYa5gJ6UEx55tF01N3p9VbYo5lJH0USIaqrb+fb2hB0Yzgm5/C9c//ios4TQMKw/qZcT87c0s6MYT4yIHN+NRo5g/4FbCGcjfYsD12il3makYjuGJxaXWU2onYnMIUvJ+JnhvQvR6sNs4Ifp1B7Y4oHsM5Ifxx0RCYkBRnAa6G97Iqv/aLQEOO0pQ4sIDjEESKT1ak6tTf9biiAQQ==" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/TimbreFiscalDigital/TimbreFiscalDigital.xsd" xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" /></cfdi:Complemento></cfdi:Comprobante>'

The start is very similar, but the ending is not.

After further investigation the it seams the problem are iso-8859-1 careacters, there are some "é" on my string.
This caracteres are suposed to be there, as they are common on spanish.
In jruby 1.3 it seams that there isn´t suport to use "string.encode('utf-8')'
i tried "cfdi = cfdi.gsub(/\u[\da-f]{4}/i) { |m| [m[-4..-1].to_i(16)].pack('U') }", in an attemp to encode for 'UTF-8', but is not working

@Myuzu
Copy link
Author

Myuzu commented Nov 17, 2017

@alejandroMA jruby, prior to version 1.7, is not known for decent encoding support :( Upgrading to 1.7 branch is not an option?

@alejandroMA
Copy link

@Myuzu mmm, i dont have more that 12h of experience in ruby, this work i'm doing as mantainance of a very old rails website.

We'll try updataing to jruby on a virtual machine clone, and see what happens, but in the past when updating that website to another jruby it stoped working.

What version of jruby do you recomend ? 1.7 ?

does 1.7 have suport for "string.encode('utf-8')" ?

Thank you so much for your help.

@Myuzu
Copy link
Author

Myuzu commented Nov 17, 2017

@alejandroMA I'm actually not working with ruby anymore. As far as I recall, 1.7 branch do not have any issues with additional encodings support.

Upgrading complex rails app could be real pain, done it couple times 😫 Wish you good luck with that!

I suppose, guys here, can't help you because 1.3 branch is simply too old. All development effort is focused on JRuby 9000, and I doubt you can upgrade your app so far away.

Nevertheless, if you will stuck upgrading the app, mail me and I try to help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants