2013-02-12 59 views
5

这种语言Iconv成语转码字符串为UTF-8并丢弃不能音译字符:你会如何写的`Iconv.new( “UTF8 //忽略”,...)`成语测试?

require "iconv" 

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

你将如何实际编写了这个测试?

编辑:我最终简化了这个问题,因为我意识到试图在Rails # encoding: utf-8 spec文件中测试这个问题的上下文使问题变得复杂。所以,现在的赏金是一种愚蠢,但我反正奖励,如果有人可以显示一个测试,我可以过的工作。

+0

也许,看看这个:HTTP:/ /robots.thoughtbot.com/post/42664369166/fight-back-utf-8-invalid-byte-sequences – Hock 2013-02-21 04:50:24

回答

3

可以从字节数组使用#pack方法构造字符串。这样,您可以轻松生成无效/错误的字符串,并在测试中使用它。

例子:

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 

(我在相当长的测试字符串对不起,我只是找不到在我的代码更短的例子)

+0

你可以在你的测试中解释'force_encoding'的用途吗?它会模仿通过'accept-charset = utf8'形式传递字符串的过程吗? – danneu 2013-02-16 18:05:20

+0

是的,确切地说。你想用'normalize'方法实现的目标是将无效的utf8字符串转换为有效的字符串。所以为了测试你的方法,你首先必须创建一个无效的utf8字符串。上面的方法是我找到的最简单的方法:使用'pack'从字节集合中创建一个字符串,然后使用'force_encoding'将这个字符串标记为utf8 ... – severin 2013-02-17 11:08:27

1

在轨测试此,即使有一个#encoding组是可能的。

只需使用一个编码步骤一样网址转义:

require "iconv" 
require "cgi" 

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

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

,以便与该你可以写一个断言。

当您使用Ruby 1.9的语言Iconv已被废弃,你应该使用字符串的encode方法!

+0

是啊,这个问题的出现,因为我想用'字符串#encode'更换语言Iconv对Ruby 2.0.0兼容性,我试图抵御回归。 – danneu 2013-02-14 23:53:46

+0

所以答案不适合你的问题?或者为什么除了你呢? – phoet 2013-02-16 09:30:23