Как удалить все символы, отличные от ASCII, из строки в Ruby

Мне кажется, это очень простой и очень необходимый метод. Мне нужно удалить все несимвольные символы из строки. например, Â © и т.д. См. следующий пример.

#coding: utf-8
s = " Hello this a mixed string © that I made."
puts s.encoding
puts s.encode

выход:

UTF-8
Hello this a mixed str

ing ┬⌐, который я сделал.

Когда я передаю это Watir, он вызывает следующую ошибку: несовместимые кодировки символов: UTF-8 и ASCII-8BIT

Итак, моя проблема в том, что я хочу избавиться от всех символов, отличных от ASCII, перед тем, как их использовать. Я не буду знать, какая кодировка использует исходная строка.

Я уже довольно давно искал и экспериментировал.

Если я пытаюсь использовать

  puts s.encode('ASCII-8BIT')

Он дает ошибку:

 : "\xC2\xA9" from UTF-8 to ASCII-8BIT (Encoding::UndefinedConversionError)

Ответы

Ответ 1

Вы можете просто буквально перевести то, что вы просили, в Regexp. Вы писали:

Я хочу избавиться от всех символов, отличных от ASCII

Мы можем немного перефразировать это:

Я хочу заменить все символы, которые не имеют свойства ASCII, ничего

И это утверждение, которое может быть непосредственно выражено в Regexp:

s.gsub!(/\P{ASCII}/, '')

В качестве альтернативы вы также можете использовать String#delete!:

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

Ответ 3

UTF-8 является кодировкой переменной длины. Когда символ занимает один байт, его значение совпадает с 7-битным ASCII. Итак, почему бы вам просто не искать байты с "1" в MSB, а затем удалить их и их трейлеры? Байт, начинающийся с '110', будет сопровождаться одним дополнительным байтом. Байт, начинающийся с "1110", будет сопровождаться двумя. И байт, начинающийся с "11110", будет сопровождаться тремя, максимум поддерживается UTF-8.

Все это совсем близко от моей головы. Я мог ошибаться.