5

此 Iconv 惯用语将字符串转码为 UTF-8 并丢弃无法音译的字符:

require "iconv"

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

您实际上将如何为此编写测试?

编辑:我最终简化了问题,因为我意识到尝试在 Rails# encoding: utf-8规范文件中测试它的上下文使问题复杂化。所以现在赏金有点傻,但无论如何我都会奖励它,如果有人可以展示我可以完成的测试。

4

2 回答 2

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

(对于相当长的测试字符串,我很抱歉,我只是在我的代码中找不到更短的示例)

于 2013-02-16T15:42:45.443 回答
1

在rails中测试这个,即使#encoding有一套也是可能的。

只需使用 URL 转义之类的编码步骤:

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字符串的方法!

于 2013-02-14T20:44:17.430 回答