2014-05-14 5 views
10

Ho un processo che recupera un file flat da un mainframe tramite FTP. Questo di solito funziona bene, ma ogni tanto il file conterrà qualcosa di un carattere accento. Se si tenta di ottenere un file contenente un accento, l'intero processo non riesce con il seguente errore: Encoding::UndefinedConversionError: "\x88" from ASCII-8BIT to UTF-8Utilizzo di Net :: FTP gettextfile con caratteri non validi (ASCII-8BIT vs UTF-8)

Questo è il metodo gettextfileNet::FTP. Molte persone suggeriscono semplicemente di passare a getbinaryfile - così facendo mi permetterò di scaricare il file, ma il file risultante è qualcosa che non posso più analizzare (dice che è in UTF-8, ma i contenuti non hanno senso).

C'è un modo per recuperare semplicemente e salvare il file come ASCII senza avere i binari convertono automaticamente l'output in UTF-8? Ecco il mio codice:

Net::FTP.open(config['host']) do |ftp| 
    Rails.logger.info("FTP Connection established") 

    ftp.login(config['user'], config['password']) 
    Rails.logger.info("Login Successful") 

    ftp.gettextfile("'#{config['es_in']}'", "data/es-in.#{Time.now.utc.strftime("%Y%m%d-%H%M%S")}") 
    ftp.gettextfile("'#{config['ca_in']}'", "data/ca-in.#{Time.now.utc.strftime("%Y%m%d-%H%M%S")}") 

    Rails.logger.info("Download(s) completed, terminating connection.") 
end 
+0

Mancano campioni del testo incriminato. Aiuterebbe anche a sapere quali sono i primi due byte del file, insieme a un piccolo dump esadecimale di un file. "Le domande che cercano aiuto per il debug (" perché non funziona questo codice? ") Devono includere il comportamento desiderato, un problema specifico o un errore e il codice più breve necessario per riprodurlo nella domanda stessa. ad altri lettori Vedi: [Come creare un esempio minimo, completo e verificabile] (http://stackoverflow.com/help/mcve). " –

risposta

0

Se ricordo bene, i file di testo in FTP-dom sono ASCII-7 bit e non possono contenere caratteri con il set di alto-bit, AKA ASCII-8BIT. I caratteri accentati, anche in ASCII esteso o 8BIT o qualsiasi altra cosa che vogliamo chiamare qualcosa sopra 0x7F, devono essere trasferiti in modalità binaria.

Da the FTP RFC:

ASCII 

    The ASCII character set is as defined in the ARPA-Internet 
    Protocol Handbook. In FTP, ASCII characters are defined to be 
    the lower half of an eight-bit code set (i.e., the most 
    significant bit is zero). 

Quindi sì, probabilmente si dovrebbe usare getbinaryfile invece.

La principale differenza pratica tra i due è che la modalità binaria non eseguirà le traduzioni di fine riga. Se il sistema di origine è basato su ECDIC o con una dimensione di parola alternativa, gettextfile tradurrà il file al volo in ASCII. Incontrare personaggi che non sono nella codifica prevista potrebbe facilmente innescare il tipo di problema che stai vedendo.

Se il file non ha senso dopo il trasferimento utilizzando getbinaryfile, potrebbe trovarsi in un set di codici alternativo rispetto a UTF8 sul mainframe. Dovrai capire che codice è presente su quel sistema e aprire il file con le impostazioni di codifica appropriate dopo il download. È possibile utilizzare il comando file sui sistemi * nix per formulare un'ipotesi sulla codifica di un file, ma non è un test esaustivo e può essere fuorviante. Poiché il file proviene da un mainframe, potrebbe utilizzare un word-size diverso come UTF-16BE, UTF-32LE o essere codificato in EBCDIC. Questo è dove trattare con sistemi operativi e hardware alternativi diventa davvero fastidioso.

Senza esempi di testo, i primi due byte del file e un campionamento del testo in un hex-dump, è difficile aiutarti.

E, dopo tutto, potrebbe essere più semplice utilizzare cURL o la gemma Curb per recuperare il file. cURL è molto flessibile e potente e potrebbe darti gli strumenti di cui hai bisogno.

Problemi correlati