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

Я, кажется, очень простой и очень необходимый метод. Я должен удалить все не символы 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)
17
задан Nick 8 July 2010 в 04:06
поделиться

3 ответа

Удалите символы с помощью регулярного выражения. Этот пример написан на C #, но регулярное выражение должно быть таким же: Как удалить из строки символы, отличные от ASCII? (в C #)

Преобразовать его в ruby ​​с помощью gsub не составит труда.

2
ответ дан 30 November 2019 в 11:26
поделиться

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

Это все только с моей головы. Я могу ошибаться.

1
ответ дан 30 November 2019 в 11:26
поделиться

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

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

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

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

И это утверждение можно напрямую выразить в Regexp:

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

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

s.delete!("^\u{0000}-\u{007F}")
37
ответ дан 30 November 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: