ruby不正确的方法行为(可能取决于charset)

时间:2011-10-07 16:00:14

标签: ruby whitespace strip

我从ruby(在irb中)得到了奇怪的行为:

irb(main):002:0> pp "    LS 600"
"\302\240\302\240\302\240\302\240LS 600"

irb(main):003:0> pp "    LS 600".strip
"\302\240\302\240\302\240\302\240LS 600"

这意味着(对于那些不理解的人),strip方法根本不会影响此字符串,与gsub('/\s+/', '')相同

如何删除该字符串(我在解析Internet页面时得到了它)?

1 个答案:

答案 0 :(得分:6)

字符串"\302\240"是Unicode代码点C2 A0的UTF-8编码字符串(A0),表示非中断空格字符。还有许多其他Unicode空格字符。不幸的是,String#strip方法没有删除这些。

如果您使用Ruby 1.9.2,那么您可以通过以下方式解决此问题:

# Ruby 1.9.2 only.
# Remove any whitespace-like characters from beginning/end.
"\302\240\302\240LS 600".gsub(/^\p{Space}+|\p{Space}+$/, "")

在Ruby 1.8.7中对Unicode的支持并不是那么好。如果你可以依赖Rails的ActiveSupport::Multibyte,你可能会成功。这样做的好处是可以免费获得有效的strip方法。使用gem install activesupport安装ActiveSupport,然后尝试:

# Ruby 1.8.7/1.9.2.
$KCODE = "u"
require "rubygems"
require "active_support/core_ext/string/multibyte"

# Remove any whitespace-like characters from beginning/end.
"\302\240\302\240LS 600".mb_chars.strip.to_s