2013-03-14 8 views
6

Ho qualche problema con il condimento UTF-8. Ho letto alcuni post qui, ma ancora non funziona correttamente in qualche modo.ruby, `match ': sequenza byte non valida in UTF-8

Questo è il mio codice:

#!/bin/env ruby 
#encoding: utf-8 

def determine 
    file=File.open("/home/lala.txt")   
    file.each do |line|   
    puts(line) 
    type = line.match(/DOG/) 
    puts('aaaaa') 

    if type != nil 
     puts(type[0]) 
     break 
    end   

    end 
end 

che sono le prime 3 righe del mio file:

;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en-lalalalallalalalalalalalaln Cell Generation 
text/lalalalala1.0.0.1515 
text/lalalala�DOG 

Quando ho eseguito questo codice che mi mostra un errore esattamente quando la lettura della terza linea di il file (dove la parola cane si alza):

;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en-lalalalallalalalalalalalaln Cell Generation 
aaaaa 

text/lalalalala1.0.0.1515 
aaaaa 

text/lalalala�DOG 
/home/kik/Desktop/determine2.rb:16:in `match': invalid byte sequence in UTF-8 (ArgumentError) 

MA: se corro solo aa determ ine function con il seguente contenuto:

#!/bin/env ruby 
#encoding: utf-8 

    def determine 
    type="text/lalalala�DOG".match(/DOG/) 
    puts(type) 
end 

funziona perfettamente.

Cosa non va? Grazie in anticipo!

EDIT: La terza riga del file è:

text/lalalal»DOG 

MA quando stampo la linea thirf del file in Ruby si presenta come:

text/lalalala�DOG 

EDIT2:

This format was also developed to support localization. Strings stored within the file are stored as 2 byte UNICODE characters.The format of the file is a binary file with data stored in network byte order (big-endian format).

+0

Sei sicuro che il carattere sia UTF-8? Si presenta come sconosciuto per me. Qual è il codice? – Linuxios

+0

@Linuxios se eseguo il codice senza #encoding: utf-8 Ricevo ancora un messaggio di errore con "sequenza di byte non valida in UTF-8" e se eseguo il codice type = "text/lalalala DOG" .match (/ DOG /) funziona – Tonja

+0

Qual è il codice del personaggio? – Linuxios

risposta

1

Provare a utilizzare questo:

File.open("/home/lala.txt", "r:UTF-8") 

Sembra esserci un problema con la codifica errata utilizzata in alcune fasi. #encoding :utf specifica solo la codifica del file di origine, che influisce sul modo in cui la stringa letterale viene interpretata e non ha alcun effetto sulla codifica utilizzata da File.open.

+0

Ho ancora lo stesso errore – Tonja

+0

https://gist.github.com/anonymous/ed9bb83c29fc793fa869 – Tonja

3

Credo che @Amadan sia vicino, ma ha fatto i conti indietro. Mi piacerebbe fare questo:

File.open("/home/lala.txt", "r:ASCII-8BIT") 

Il carattere non è valido UTF-8, ma per i vostri scopi, sembra che a 8-bit ASCII funzionerà benissimo. La mia comprensione è che Ruby sta usando quella codifica per impostazione predefinita quando si usa semplicemente la stringa, che è il motivo per cui funziona.

Aggiornamento: In base al più recente commento, suona come questo è quello che vi serve:

File.open("/home/lala.txt", "rb:UTF-16BE") 
+0

Funziona, voglio dire, non ricevo un messaggio di errore, ma type = line.match (/ DOG /) non funziona. Non trova una parola DOG in un file. – Tonja

+0

Ah, giusto. Doveva essere qualcosa sulle codifiche. – Amadan

+0

non ha funzionato: 5: in "initialize": la codifica ASCII incompatibile richiede binmode (ArgumentError) \t da /home/kik/Desktop/determine2.rb:5:in 'open' – Tonja

-1

soluzione semplice per il minor numero di file:

@Katja aprire il file in alcuni editor di testo e fare clic su Salva come opzione e cambiare il suo formato in UTF-8 e fare clic su OK. il pop-up verrà visualizzato per sostituirlo o crearne uno nuovo. Sostituisci il file esistente e sei attivo.

Problemi correlati