Есть ли способ в ruby ​​1.9 удалить недопустимые последовательности байтов из строк? - PullRequest
26 голосов
/ 03 января 2012

Предположим, у вас есть строка типа "€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"

Но при этом также теряется действительный многобайтовый символ € 1015 *

Ответы [ 4 ]

34 голосов
/ 03 января 2012
"€foo\xA0".encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8')
33 голосов
/ 03 января 2012
"€foo\xA0".chars.select(&:valid_encoding?).join
1 голос
/ 26 апреля 2017

Ruby 2.0 и 1.9.3

"€foo\xA0".encode(Encoding::UTF_8, Encoding::UTF_8, :invalid => :replace)

Рубин 2,1 +

"€foo\xA0".scrub
0 голосов
/ 11 октября 2014
    data = '' if not (data.force_encoding("UTF-8").valid_encoding?)
...