Как удалить все символы, отличные от 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}")
Ответ 2
Разделите символы с помощью регулярного выражения. Этот пример находится в С#, но регулярное выражение должно быть одинаковым:
Как вы можете вырезать не-ASCII-символы из строки? (в С#)
Перевод его в ruby с помощью gsub не должен быть трудным.
Ответ 3
UTF-8 является кодировкой переменной длины. Когда символ занимает один байт, его значение совпадает с 7-битным ASCII. Итак, почему бы вам просто не искать байты с "1" в MSB, а затем удалить их и их трейлеры? Байт, начинающийся с '110', будет сопровождаться одним дополнительным байтом. Байт, начинающийся с "1110", будет сопровождаться двумя. И байт, начинающийся с "11110", будет сопровождаться тремя, максимум поддерживается UTF-8.
Все это совсем близко от моей головы. Я мог ошибаться.