2013-11-30 5 views
23

Я попытался strip ведущую пробельные строки:Почему полоса не удаляет ведущие пробелы?

" Bagsværd".strip # => " Bagsværd" 

я ожидаю его вернуть "Bagsværd" вместо этого.

+0

Это странно. Я запускаю Ruby 2.0.0p247 и Rails 4.0.0, а «Bagsværd» .strip возвращает «Bagsværd» для меня. То же самое происходит в Ruby 1.9.3p484 с Rails 3.2.13. Вы пробовали это в другой версии Ruby или Rails? –

+2

'strip' удаляет ведущие пробелы на каждом интерпретаторе, который я видел, вы получаете тот же результат при вставке этого в новую консоль IRB? – carpeliam

+0

Нет. Я также обновил до 2.0.0p353 из-за проблем с безопасностью с p272 (который я использовал ранее). И да, я перезагрузил консоль много раз, но все равно получаю вышеупомянутый вывод. – Severin

ответ

29

Где строка " Bagsværd" взялось?

Вполне вероятно, что символ пробела в начале строки не является «нормальным» пространство, но неразрывный пробел (U + 00A0):

2.0.0p353 :001 > " Bagsværd".strip 
=> "Bagsværd" 
2.0.0p353 :002 > "\u00a0Bagsværd".strip 
=> " Bagsværd" 

Вы можете удалить его с gsub скорее чем strip:

2.0.0p353 :003 > "\u00a0Bagsværd".gsub(/\A\p{Space}*/, '') 
=> "Bagsværd" 

Это использует \A anchor и \p{Space} character property подражать lstrip. Для того, чтобы поломать как верхние, так и конечные пробелы, используйте:

2.0.0p353 :007 > "\u00a0Bagsværd\u00a0".gsub(/\A\p{Space}*|\p{Space}*\z/, '') 
=> "Bagsværd" 
+1

+1 для использования '\ p {Space}'. Альтернативой является использование набора символов Posix '[[: space:]]': '" Bagsværd "[/ [[: space:]] /] # =>" \ u00A0 "'. –

+0

Это исправлено. Большое вам спасибо за информацию! – Severin

+1

вынос здесь A> операция по струне против UTF-8 (или -16 и т. Д.) Отстой, по http://mortoray.com/2013/11/27/the-string-type-is-broken/, и B> если ваша операция по строкам завершилась неудачно, отключите «Bagsværd» .bytes', чтобы увидеть, действительно ли ведущее пространство является '32'! – Phlip

3

Первый символ в строке является не пробельные

" Bagsværd".bytes 
[194, 160, 66, 97, 103, 115, 118, 195, 166, 114, 100] 

" Bagsværd".chars[0].ord 
=> 160 

U+00A0 Это не прорыв пространства. Заметьте, я мог бы сказать это, потому что редактируемая форма вопроса сохраняет характер (в то время как любой, кто пытается вырезать и вставлять из , вынесенный SO post не сможет реплицировать вашу проблему)

+0

Следовательно, «new-f *** s не может tri-force» C-; – Phlip

+0

Хорошее мышление, Нейл, и хорошо знать. –

0

Является первым символом пробела или что-то другое, например \ U00af (Non-breaking space)

Это может дать тот же результат:

#encoding: utf-8 
puts " Bagsværd".strip #Bagsværd 
a = "\u00A0Bagsværd" 
puts a   # Bagsværd 
puts a.strip # Bagsværd 

#Maybe the example works not, when the code is posted/taken via cut+paste 
b = ' Bagsværd' 
p a == b #true 

Вы можете проверить, что вы с:

a = "\u00A0Bagsværd" 
b = ' Bagsværd' 
p a.codepoints.to_a #[160, 66, 97, 103, 115, 118, 230, 114, 100] 
p b.codepoints.to_a #[32, 66, 97, 103, 115, 118, 230, 114, 100] 
2

Наиболее вероятным способом, что strip не удаляя пространство , - это когда это не просто пространство, но является неразрывным пространством.

Попробуйте это на вашей машине:

# encoding: utf-8 
" Bagsværd".chars.map(&:ord) 

На шахте, используя Рубин 2.0.0p353:

# => [160, 66, 97, 103, 115, 118, 230, 114, 100] 
+0

На самом деле, если вы редактируете OP, вы получите его исходную строку с неразрывным пространством. В то время как вырезать и вставлять из обработанного сообщения, а SO преобразует его в обычное пространство. –

+0

Да, я просто сделал это и, конечно, «ну, вот оно. –

Смежные вопросы