2013-03-14 5 views
6

Ich habe ein Problem mit UTF-8-Verkettung. Ich habe hier einige Posts gelesen, funktioniert aber immer noch nicht richtig.Ruby, `match ': ungültige Bytefolge in UTF-8

, dass mein Code:

#!/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 

, dass die ersten drei Zeilen meiner Datei sind:

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

Wenn ich diesen Code ausführen genau es zeigt mir einen Fehler, wenn die dritte Zeile des Lesens die Datei (wobei das Wort Hund steht):

;?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) 

ABER: wenn ich nur aa determ laufen Funktion mit folgendem Inhalt:

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

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

es funktioniert perfekt.

Was läuft da falsch? Vielen Dank im Voraus!

EDIT: Die dritte Zeile in der Datei ist:

text/lalalal»DOG 

aber wenn ich die thirf Zeile der Datei in Ruby drucken zeigt sich, wie:

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

Sind Sie sicher, dass das Zeichen UTF-8 ist? Es erscheint als unbekannt für mich. Was ist der Code? – Linuxios

+0

@Linuxios wenn ich den Code ohne # encoding: utf-8 Ich bekomme immer noch eine Fehlermeldung mit "ungültigen Byte-Sequenz in UTF-8" und wenn ich den Code ausführen Typ = "text/lalalala DOG" .match (/ DOG /) es funktioniert – Tonja

+0

Was ist der Zeichencode? – Linuxios

Antwort

1

Versuchen Sie Folgendes:

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

Es scheint ein Problem mit der falschen Kodierung zu geben, die irgendwann verwendet wird. #encoding :utf gibt nur die Codierung der Quelldatei an, die sich auf die Interpretation der Literalzeichenfolge auswirkt, und hat keinen Einfluss auf die Codierung, die File.open verwendet.

+0

Ich bekomme immer noch den gleichen Fehler – Tonja

+0

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

3

Ich glaube @Amadan ist nah, aber hat es rückwärts. Ich würde dies tun:

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

Der Charakter ist nicht gültig UTF-8, aber für Ihre Zwecke, es sieht aus wie 8-Bit-ASCII wird funktionieren. Mein Verständnis ist, dass Ruby diese Codierung standardmäßig verwendet, wenn Sie nur die Zeichenfolge verwenden, weshalb das funktioniert.

Update: Basierend auf Ihrem letzten Kommentar, es so klingt, ist, was Sie brauchen:

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

Es funktioniert, ich meine, ich bekomme keine Fehlermeldung, aber Typ = line.match (/ DOG /) funktioniert nicht. Es findet kein Wort DOG in einer Datei. – Tonja

+0

Ah, richtig. Mußte etwas über Kodierungen sein. – Amadan

+0

hat nicht funktioniert: 5: in 'initialize ': ASCII inkompatible Codierung benötigt binmode (ArgumentError) \t von /home/kik/Desktop/determine2.rb:5:in' öffnen' – Tonja

-1

einfache Lösung für eine geringere Anzahl von Dateien:

@Katja die Datei öffnen Klicken Sie in einem Texteditor auf Speichern als Option und ändern Sie das Format in UTF-8 und klicken Sie auf OK. Popup wird angezeigt, um neue zu ersetzen oder neu zu erstellen. Ersetzen Sie die vorhandene Datei und Sie sind eingeschaltet.

Verwandte Themen