如何从ruby字符串中删除非UTF8字符?我有一个字符串,例如“xC2”。我想从字符串中删除该字符,以使其成为有效的UTF8。
此:
text.gsub!(/\xC2/, '')
返回错误:
incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)
我正在查看text.unpack('U *')和string.pack,但没有到达任何地方。
答案 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?)