Подтвердить что ты не робот

Удалить не-UTF-символы из строки в Ruby?

Как удалить символы, отличные от UTF8, из строки ruby? У меня есть строка, которая имеет в ней, например, "xC2". Я хочу удалить этот char из строки, чтобы он стал действительным UTF8.

Это:

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

возвращает ошибку:

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

Я смотрел text.unpack('U *') и string.pack, но ничего не получал.

4b9b3361

Ответ 1

Вы можете использовать для этого кодировку. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Подробнее о Ruby-Docs

Ответ 2

Вы можете сделать это вот так:

# 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

Ответ 3

Попробуйте 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

Вы можете использовать /n, как в

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

чтобы заставить Regexp работать с байтами.

Вы уверены, что это то, что вы хотите? Любой символ Юникода в диапазоне [U + 80, U + BF] будет иметь \xC2 в кодированной форме UTF-8.

Ответ 5

Лучшее решение этой проблемы, которое я нашел, - это ответ на тот же вопрос: fooobar.com/questions/200658/....

Короче: "€foo\xA0".chars.select(&:valid_encoding?).join

Ответ 6

В тексте есть кодировка ASCII-8BIT, вместо этого вы должны использовать это:

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

Он разорвет ту же цель.

Ответ 7

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