Ответ 1
Вы можете использовать для этого кодировку.
text.encode('UTF-8', :invalid => :replace, :undef => :replace)
Подробнее о Ruby-Docs
Как удалить символы, отличные от UTF8, из строки ruby? У меня есть строка, которая имеет в ней, например, "xC2". Я хочу удалить этот char из строки, чтобы он стал действительным UTF8.
Это:
text.gsub!(/\xC2/, '')
возвращает ошибку:
incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)
Я смотрел text.unpack('U *') и string.pack, но ничего не получал.
Вы можете использовать для этого кодировку.
text.encode('UTF-8', :invalid => :replace, :undef => :replace)
Подробнее о Ruby-Docs
Вы можете сделать это вот так:
# 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
Попробуйте 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"
Вы можете использовать /n
, как в
text.gsub!(/\xC2/n, '')
чтобы заставить Regexp работать с байтами.
Вы уверены, что это то, что вы хотите? Любой символ Юникода в диапазоне [U + 80, U + BF] будет иметь \xC2
в кодированной форме UTF-8.
Лучшее решение этой проблемы, которое я нашел, - это ответ на тот же вопрос: fooobar.com/questions/200658/....
Короче: "€foo\xA0".chars.select(&:valid_encoding?).join
В тексте есть кодировка ASCII-8BIT, вместо этого вы должны использовать это:
String.delete!("^\u{0000}-\u{007F}");
Он разорвет ту же цель.
data = '' if not (data.force_encoding("UTF-8").valid_encoding?)