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

そのためにencodeを使用できます。 text.encode('UTF-8', :invalid => :replace, :undef => :replace)

詳細については、 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 に答える