5

Diese Iconv Idiom Transcodierungen eine Zeichenfolge in UTF-8 und Tropfen Zeichen, die transkribiert werden können:Wie würden Sie einen Test für das Iconv.new ("UTF8 // IGNORE", ...) `Idiom schreiben?

require "iconv" 

def normalize(text) 
    Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(text.dup) 
end 

Wie würden Sie tatsächlich einen Test für dieses schreiben?

Edit: Ich endete die Frage zu vereinfachen, da ich erkannte, dass der Kontext des Versuchs, dies in einer Rails # encoding: utf-8 Spec-Datei zu testen, das Problem verkompliziert. So, jetzt ist das Kopfgeld irgendwie albern, aber ich werde es trotzdem belohnen, wenn jemand einen Test zeigen kann, von dem ich arbeiten kann.

+0

Vielleicht, schau mal: http://robots.thoughtbot.com/post/42664369166/fight-back-utf-8-invalid-byte-sequences – Hock

Antwort

3

Sie können Strings aus einem Byte-Array mit der Methode #pack konstruieren. Auf diese Weise können Sie einfach eine ungültige/ungültige Zeichenfolge generieren und in einem Test verwenden.

Beispiel:

describe "#normalize" do 
    it "should remove/ignore invalid characters" do 
    # this "string" equals "Mandados de busca do caso Megaupload considerados inv\xE1lidos - Tecnologia - Sol" 
    bad_string = [77, 97, 110, 100, 97, 100, 111, 115, 32, 100, 101, 32, 98, 117, 115, 99, 97, 32, 100, 111, 32, 99, 97, 115, 111, 32, 77, 101, 103, 97, 117, 112, 108, 111, 97, 100, 32, 99, 111, 110, 115, 105, 100, 101, 114, 97, 100, 111, 115, 32, 105, 110, 118, 225, 108, 105, 100, 111, 115, 32, 45, 32, 84, 101, 99, 110, 111, 108, 111, 103, 105, 97, 32, 45, 32, 83, 111, 108].pack('c*').force_encoding('UTF-8') 

    normalize(bad_string).should == 'Mandados de busca do caso Megaupload considerados invlidos - Tecnologia - Sol' 
    end 
end 

(Es tut mir leid für den eher langen Test-String, ich kann einfach nicht ein kürzeres Beispiel in meinem Code finden)

+0

Können Sie den Zweck von 'force_encoding' in Ihrem Test erklären? Würde es den Prozess der Übergabe eines Strings durch ein 'accept-charset = utf8' Formular oder etwas emulieren? – danneu

+0

Ja, genau. Die Sache, die Sie mit Ihrer 'normalize' Methode erreichen wollen, ist die Umwandlung ungültiger utf8 Zeichenfolgen in gültige. Um Ihre Methode zu testen, müssen Sie zuerst eine ungültige utf8-Zeichenfolge erstellen. Und die obige Methode ist die einfachste Methode, die ich gefunden habe: Verwenden Sie 'pack', um eine Zeichenfolge aus einer Sammlung von Bytes zu erstellen, und dann' force_encoding', um diese Zeichenfolge als utf8 zu markieren ... – severin

1

Testen Sie dies in Schienen, auch mit einem #encoding Set ist möglich.

verwenden nur eine Codierung für Schritt wie URL-Fluchten:

require "iconv" 
require "cgi" 

def normalize(text) 
    Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(text) 
end 

puts normalize(CGI.unescape("m%FCstring")) # => mstring 

so mit, dass Sie eine Assertion schreiben konnte.

Wenn Sie Ruby 1.9 verwenden Iconv ist veraltet und Sie sollten die encode Methoden von String verwenden!

+0

Ja, diese Frage kam, weil ich versuche, Iconv durch 'String # encode' für Ruby 2.0.0 zu ersetzen Kompatibilität und ich versuche, Regressionen zu verteidigen. – danneu

+0

so passt die Antwort nicht zu Ihrer Frage? oder warum tust du es nicht? – phoet

Verwandte Themen