2012-08-27 54 views
27

如何從ruby字符串中刪除非UTF8字符?我有一個字符串,例如「xC2」。我想從字符串中刪除該字符,以使其成爲有效的UTF8。從Ruby中的字符串中刪除非UTF字符?

此:

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

返回一個錯誤:

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

我看着text.unpack( 'U *')和string.pack爲好,但沒有取得任何進展。

+1

你可能會發現http://stackoverflow.com/questions/11375342/stringencode-not-fixing-invalid-byte-sequence-in-utf-8-error/有用 –

回答

3

您可以使用/n,如

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

迫使正則表達式對字節操作。

你確定這是你想要的嗎?範圍[U + 80,U + BF]中的任何Unicode字符將以其UTF-8編碼形式的\xC2

+1

這給了我'不兼容的編碼正則表達式匹配(ASCII -8位正則表達式與UTF-8字符串)' –

+0

完美。謝謝。 – Dogweather

6

你可以做這樣的

# 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

'.select(&:valid_encoding?)'而不是'.collect {}'要短得多。 – ephemient

+0

你是對的ephemient,它保持理解,謝謝,我適應我的回答 – peter

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" 
+2

一注意:'Iconv'是(將)從Rails 3.2贊成'String#encode'棄用 – nikola

64

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

欲瞭解更多信息考慮Ruby-Docs

+5

每當你看到你有10從這個答案的要點,你必須知道多少頭撞在一張桌子上,你剛剛救了一個人。 – hobberwickey

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

你的文字有ASCII-8BIT編碼,而不是你應該使用這樣的:

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

它將斷絕同樣的目的。