Я, кажется, очень простой и очень необходимый метод. Я должен удалить все не символы ASCII от строки. например, © и т.д. Посмотрите следующий пример.
#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
луг ┬⌐, что я сделал.
Когда я подаю это к Watir, он производит после error:incompatible кодировок символов: UTF-8 и ASCII-8BIT
Таким образом, моя проблема состоит в том, что я хочу избавиться от всех не символы ASCII перед использованием его. Я не буду знать, который, кодируя исходную строку использует "s".
Я искал и экспериментировал в течение достаточно долгого времени теперь.
Если я пытаюсь использовать
puts s.encode('ASCII-8BIT')
Это дает ошибку:
: "\xC2\xA9" from UTF-8 to ASCII-8BIT (Encoding::UndefinedConversionError)
Удалите символы с помощью регулярного выражения. Этот пример написан на C #, но регулярное выражение должно быть таким же: Как удалить из строки символы, отличные от ASCII? (в C #)
Преобразовать его в ruby с помощью gsub не составит труда.
UTF-8 - это кодировка переменной длины. Когда символ занимает один байт, его значение совпадает с 7-битным ASCII. Так почему бы вам просто не поискать байты с '1' в MSB, а затем удалить и их, и их трейлеры? За байтом, начинающимся с '110', будет следовать один дополнительный байт. За байтом, начинающимся с '1110', последуют два. А за байтом, начинающимся с '11110', будет следовать три, максимум, поддерживаемый UTF-8.
Это все только с моей головы. Я могу ошибаться.
Вы можете просто буквально перевести то, что вы спросили в Regexp
. Вы написали:
Я хочу избавиться от всех не ASCII символов
Мы можем немного перефразировать это:
Я хочу заменить все символы, не имеющие свойства
ASCII
, ничем
И это утверждение можно напрямую выразить в Regexp
:
s.gsub!(/\P{ASCII}/, '')
В качестве альтернативы можно также использовать String#delete!
:
s.delete!("^\u{0000}-\u{007F}")