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