Как удалить все не-ASCII символы из строки в Ruby - PullRequest
16 голосов
/ 08 июля 2010

Мне кажется, это очень простой и очень необходимый метод.Мне нужно удалить все символы не 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

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

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

Так что моя проблема в том, что я хочу избавиться от всех не ASCII-символов перед его использованием.Я не буду знать, какую кодировку использует исходная строка "s".

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

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

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

выдает ошибку:

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

Ответы [ 3 ]

36 голосов
/ 08 июля 2010

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

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

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

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

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

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

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

s.delete!("^\u{0000}-\u{007F}")
2 голосов
/ 08 июля 2010

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

Перевод его в ruby ​​с использованием gsub не должен быть сложным.

1 голос
/ 08 июля 2010

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

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

...