在ruby 1.9中是否有一种方法可以从字符串中删除无效的字节序列?

时间:2012-01-03 09:57:10

标签: ruby encoding character-encoding ruby-1.9 utf

假设你有一个像"€foo\xA0"这样的字符串,编码为UTF-8,有没有办法从这个字符串中删除无效的字节序列? (所以你得到"€foo"

在ruby-1.8中,您可以使用Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "€foo\xA0"),但现在已弃用。 "€foo\xA0".encode('UTF-8')没有做任何事情,因为它已经是UTF-8了。我试过了:

"€foo\xA0".force_encoding('BINARY').encode('UTF-8', :undef => :replace, :replace => '')

产生

"foo"

但是这也失去了有效的多字节字符€

4 个答案:

答案 0 :(得分:34)

"€foo\xA0".encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8')

答案 1 :(得分:33)

"€foo\xA0".chars.select(&:valid_encoding?).join

答案 2 :(得分:1)

Ruby 2.0和1.9.3

"€foo\xA0".encode(Encoding::UTF_8, Encoding::UTF_8, :invalid => :replace)

Ruby 2.1 +

"€foo\xA0".scrub

答案 3 :(得分:-2)

    data = '' if not (data.force_encoding("UTF-8").valid_encoding?)