从Ruby中的字符串中删除非UTF字符?

时间:2012-08-27 18:27:11

标签: ruby regex string

如何从ruby字符串中删除非UTF8字符?我有一个字符串,例如“xC2”。我想从字符串中删除该字符,以使其成为有效的UTF8。

此:

text.gsub!(/\xC2/, '')

返回错误:

incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)

我正在查看text.unpack('U *')和string.pack,但没有到达任何地方。

7 个答案:

答案 0 :(得分:79)

您可以使用编码。 text.encode('UTF-8', :invalid => :replace, :undef => :replace)

有关详细信息,请查看Ruby-Docs

答案 1 :(得分:7)

你可以这样做

# encoding: utf-8

class String
  def validate_encoding
    chars.select(&:valid_encoding?).join 
  end
end

puts "testing\xC2 a non UTF-8 string".validate_encoding
#=>testing a non UTF-8 string

答案 2 :(得分:4)

您可以使用/n,如

text.gsub!(/\xC2/n, '')

强制Regexp对字节进行操作。

你确定这是你想要的吗? [U + 80,U + BF]范围内的任何Unicode字符都将以其UTF-8编码形式具有\xC2

答案 3 :(得分:4)

尝试Iconv

1.9.3p194 :001 > require 'iconv'
# => true 
1.9.3p194 :002 > string = "testing\xC2 a non UTF-8 string"
# => "testing\xC2 a non UTF-8 string" 
1.9.3p194 :003 > ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
# => #<Iconv:0x000000026c9290> 
1.9.3p194 :004 > ic.iconv string
# => "testing a non UTF-8 string" 

答案 4 :(得分:3)

你的文字有ASCII-8BIT编码,你应该使用它:

treecolumn

它将起到同样的作用。

答案 5 :(得分:2)

我发现此问题的最佳解决方案是对同一问题的回答:https://stackoverflow.com/a/8711118/363293

简而言之:"€foo\xA0".chars.select(&:valid_encoding?).join

答案 6 :(得分:-1)

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