Обычно вы видите шестнадцатеричные байты, например, когда строка использует кодировку, которая не обрабатывает эти байты.Если вы знаете, какую кодировку должна использовать строка, вы можете использовать String#force_encoding
для повторной интерпретации байтов в соответствии с желаемой кодировкой.
# Under a UTF-8 locale:
ruby-1.9.2-head :013 > "\xC2\xBB".force_encoding(Encoding::UTF_8)
=> "»"
# Under the “C” locale:
ruby-1.9.2-head :007 > "\xC2\xBB".force_encoding(Encoding::UTF_8)
=> "\u00BB"
Оба результата приводят кта же строка в кодировке UTF-8 внутри.Находясь в локали C, Ruby печатает экранированную версию, чтобы избежать печати двоичных данных на терминал (который, согласно настройке локали, может не поддерживать его).
Если строка уже использует соответствующую кодировку,затем вы должны перекодировать строку в желаемую выходную кодировку перед ее использованием:
# Under a UTF-8 locale:
ruby-1.9.2-head :026 > "\xC2\xBB".force_encoding(Encoding::ISO_8859_1).encode(Encoding::UTF_8)
=> "»"
# Under the “C” locale:
ruby-1.9.2-head :014 > "\xC2\xBB".force_encoding(Encoding::ISO_8859_1).encode(Encoding::UTF_8)
=> "\u00C2\u00BB"
Выше я использую String#force_encoding
, чтобы убедиться, что байты в строке помечены как ISO 8859-1 (потому что, например, заголовок, сопровождающий байты, говорит, что они представляют строку в кодировке ISO 8859-1), а затем использует String#encode
, перекодирует его в UTF-8 (желаемое выходное кодирование).
Наконец,, если вы действительно хотите удалить все, что не является ASCII, вы можете использовать отрицательный класс символов [:ascii:]
с String#gsub
:
ruby-1.9.2-head :030 > "foo\xC2\xBBbar".force_encoding(Encoding::UTF_8).gsub(/[[:^ascii:]]/,'')
=> "foobar"