2010-02-19 13 views
6

Ho esaminato gli altri post relativi a ruby ​​/ encoding ma non sono stato in grado di capire perché il seguente non funziona. Probabilmente solo perché sono denso, ma ecco la situazione.Problema di codifica della stringa di ruby ​​

Utilizzo di Ruby 1.9 su Windows. Ho un set di file CSV che richiedono alcuni dati aggiunti alla fine di ogni riga. Ogni volta che eseguo il mio script, i caratteri aggiunti sono senza senso. Il testo di input sembra essere la codifica IBM437, mentre la mia stringa che sto aggiungendo inizia come US-ASCII. Nulla di ciò che ho provato rispetto alla forzatura della codifica sulle stringhe di input o alla stringa di append sembra cambiare l'output risultante. Sono perplesso. La versione corrente della codifica è semplicemente l'ultima che ho provato.

def append_salesperson(txt, salesperson) 
    if txt.length > 2 
    return txt.chomp.force_encoding('US-ASCII') + %(, "", "", "#{salesperson}") 
    end 
end 

salespeople = Hash[ 
    "fname", "Record Manager"] 

outfile = File.open("ActData.csv", "w:US-ASCII") 

salespeople.each do | filename, recordManager | 
    infile = File.open("#{filename}.txt") 
    infile.each do |line| 
    outfile.puts append_salesperson(line, recordManager) 
    end 
    infile.close 
end 
outfile.close 
+0

Stai usando il commento magico di codifica nel tuo script? – kch

risposta

0

forse txt.chomp.force_encoding ('US-ASCII') +% (, "", "", "# {salesperson.force_encoding ('qualcosa')}")

?

+0

Tutto quello che ho provato lungo quelle linee non ha avuto alcun effetto. Ho provato a forzare tutto su US-ASCII, IBM437 e UTF-8 ma ogni volta che la stringa risultante è mista, con caratteri a 16 bit dall'input del file e caratteri a 8 bit dai dati generati dal programma. È interessante notare che se faccio solo un put alla console, visualizza uno spazio tra ogni carattere sull'input del file e nessuno spazio tra i dati sui dati aggiunti. –

+2

Probabilmente cercherò di trovare un "piccolo" banco di prova riproducibile e ping core rubino su di esso. – rogerdpack

+0

Si potrebbe anche provare a cambiare la code page attiva dalla console prima di lanciare lo script Ruby, usando il comando 'chcp' (ad es.' Chcp 65001' lo imposterà su UTF-8). Sfortunatamente, non puoi impostarlo su UTF-16, che è ciò che penso siano i tuoi file. – ewall

0

Sembra che i dati CSV arrivino come UTF-16 ... di conseguenza, le put vengono visualizzate come il carattere stampabile (il primo byte) più uno spazio (il secondo byte).

Hai provato a codificare i dati aggiunti con .force_encoding(Encoding::UTF-16LE) o .force_encoding(Encoding::UTF-16BE)?

1

Una piccola nota correlata alla tua domanda è che hai i tuoi dati csv come %(, "", "", "#{salesperson}"). Qui hai uno space char prima delle tue doppie virgolette. Ciò può causare che #{salesperson} venga interpretato come più campi se c'è una virgola in questo testo. Per risolvere questo problema non può esserci spazio bianco tra virgola e virgolette. Esempio: "this is a field","Last, First","and so on". Questo è un piccolo trucco che ho incontrato durante la creazione di report che devono essere visualizzati in Excel.

In Common Format and MIME Type for Comma-Separated Values (CSV) Files descrivono la grammatica di un file csv come riferimento.