Ответ 1
"€foo\xA0".chars.select(&:valid_encoding?).join
Предположим, что у вас есть строка типа "€foo\xA0"
, закодированная UTF-8, есть ли способ удалить недопустимые последовательности байтов из этой строки? (так что вы получите "€foo"
)
В ruby-1.8 вы можете использовать Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "€foo\xA0")
, но это теперь устарело. "€foo\xA0".encode('UTF-8')
ничего не делает, поскольку это уже UTF-8. Я пробовал:
"€foo\xA0".force_encoding('BINARY').encode('UTF-8', :undef => :replace, :replace => '')
что дает
"foo"
Но это также теряет действительный многобайтовый символ €
"€foo\xA0".chars.select(&:valid_encoding?).join
"€foo\xA0".encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8')
Ruby 2.0 и 1.9.3
"€foo\xA0".encode(Encoding::UTF_8, Encoding::UTF_8, :invalid => :replace)
Ruby 2.1 +
"€foo\xA0".scrub
data = '' if not (data.force_encoding("UTF-8").valid_encoding?)