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

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

Это:

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

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

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

Я также просматривал text.unpack ('U *') и string.pack, но не сделал добраться куда угодно.

30
задан 29.01.2020, 13:01

7 ответов

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

# 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
8
ответ дан 29.01.2020, 13:02
  • 1
    it' s собирающийся реализовываться в jQ UI 1.9 – Ionut Popa 05.10.2019, 17:03
  • 2
    .select(&:valid_encoding?) вместо .collect{} намного короче. – ephemient 29.01.2020, 13:02
  • 3
    you' r право ephemient и это остается понятным, спасибо, я адаптирую свой ответ – peter 29.01.2020, 13:02

Попробуйте 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
ответ дан 29.01.2020, 13:02
  • 1
    Спасибо за подсказку. It' s действительно полезный для меня:) – Blue Smith 05.10.2019, 17:06
  • 2
    одно примечание: Iconv (будет), удержанный от использования от направляющих 3.2 в пользу String#encode – nikola 29.01.2020, 13:03

Лучшее решение этой проблемы, которое я нашел, это ответ на тот же вопрос: https://stackoverflow.com/a/8711118/363293 .

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

2
ответ дан 29.01.2020, 13:03

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

Для получения дополнительной информации посмотрите в Ruby-Docs

83
ответ дан 29.01.2020, 13:03
  • 1
    почему? все еще хорошо работает для меня и it' s лучше, чем нажимают кнопку подписью – d1Mm 05.10.2019, 17:03

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

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

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

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

5
ответ дан 29.01.2020, 13:03

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

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

Он будет служить той же цели.

3
ответ дан 29.01.2020, 13:04
  • 1
    I' m не уверенный это обязательно верно. Я думаю, что это зависит от типа подписки, которую они имеют, начиная с I/S и т.д. – ajbeaven 13.10.2019, 13:22
data = '' if not (data.force_encoding("UTF-8").valid_encoding?)
0
ответ дан 29.01.2020, 13:04
  • 1
    Только добавить к этому - afaik - если Вы weren' t выполнение бесплатной демонстрационной версии, тогда ' subscr_signup' отправляется, только если первая оплата была успешна также. Таким образом, Вы могли слушать только subscr_signup, и subscr_eot для активации / деактивируют подписки. – Webcognoscere 13.10.2019, 13:22

Теги

Похожие вопросы