Как удалить неразрывное пространство в Ruby

У меня есть строка, которая выглядит так:

d = "foo\u00A0\bar"

Когда я проверяю длину, он говорит, что это 7 символов. Я проверил онлайн и узнал, что это незаменимое пространство. Может ли кто-нибудь показать мне, как удалить все неразрывные пробелы в строке?

Ответы

Ответ 1

irb(main):001:0> d = "foo\u00A0\bar"
=> "foo \bar"
irb(main):002:0> d.gsub("\u00A0", "")
=> "foo\bar"

Ответ 2

Если вы не заботитесь о нераспространяющемся пространстве конкретно, но о любом "специальном" символе пробела unicode, который может появиться в вашей строке, вы можете заменить его с помощью выражения скобки POSIX для пробелов:

s.gsub(/[[:space:]]/, '')

Эти выражения в скобках (в отличие от таких элементов, как \s) не только соответствуют символам ASCII, но и всем символам юникода класса.

Подробнее см. рубиновую документацию

Ответ 3

d.gsub("\u00A0", "") не работает в Ruby 1.8. Вместо этого используйте d.gsub(/\302\240/,"")

Смотрите http://blog.grayproductions.net/articles/understanding_m17n для большего количества символов в разностях кодировки символов между 1,8 и 1,9.

Ответ 4

Это старая нить, но, возможно, это помогает кому-то. Я обнаружил, что искал решение той же проблемы, когда обнаружил, что полоса не выполняет эту работу. Я проверил с помощью метода ord, какой символ был и использовался chr, чтобы представить его в gsub

2.2.3 :010 > 160.chr("UTF-8")
 => " " 
2.2.3 :011 > 160.chr("UTF-8").strip
 => " " 
2.2.3 :012 > nbsp = 160.chr("UTF-8")
 => " " 
2.2.3 :013 > nbsp.gsub(160.chr("UTF-8"),"")
 => ""

Я не мог понять, почему strip не удаляет что-то вроде пространства для меня, поэтому я проверил здесь, что ASCII 160 на самом деле есть.