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

これをレールでテストすることは、#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 は非推奨です。string のencodeメソッドを使用する必要があります。

于 2013-02-14T20:44:17.430 に答える