38

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

这个:

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

返回错误:

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

我也在查看 text.unpack('U*') 和 string.pack ,但没有得到任何结果。

4

7 回答 7

105

You can use encode for that. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

For more info look into Ruby-Docs

于 2012-08-27T20:48:18.110 回答
9

你可以这样做

# 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
于 2012-08-27T19:32:28.927 回答
5

您可以使用/n, 如

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

强制正则表达式对字节进行操作。

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

于 2012-08-27T19:24:02.623 回答
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" 
于 2012-08-27T20:25:54.390 回答
4

你的文本有 ASCII-8BIT 编码,而不是你应该使用这个:

String.delete!("^\u{0000}-\u{007F}"); 

它将达到同样的目的。

于 2017-03-23T14:24:15.577 回答
3

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

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

于 2015-12-17T14:37:34.653 回答
-1
data = '' if not (data.force_encoding("UTF-8").valid_encoding?)
于 2014-10-11T07:41:29.207 回答