将不间断空格转换为Ruby中的空格

时间:2010-04-06 23:07:12

标签: ruby json unicode utf-8 whitespace

我的情况是,当编码为utf-8 json时,来自html textarea或输入的用户输入数据有时会与\u00a0(非中断空格)而不是空格一起发送。

我认为这是Firefox中的一个错误,因为我知道用户不是故意放入不间断的空格而不是空格。

Ruby中还有两个错误,其中一个可以用来对抗另一个错误。

无论出于何种原因,\s都不匹配\u00a0

[^[:print:]],绝对不应该匹配)和\xC2\xA0两者都匹配,但我认为这些方法不是理想的方法来处理这个问题。

是否有其他建议可以解决此问题?

6 个答案:

答案 0 :(得分:40)

使用/\u00a0/匹配不间断的空格。例如,s.gsub(/\u00a0/, ' ')将所有非中断空格转换为常规空格。

使用/[[:space:]]/匹配所有空格,包括Unicode空格,如非中断空格。这与/\s/不同,{{1}}仅匹配ASCII空格。

另请参阅:Ruby Regexp documentation

答案 1 :(得分:6)

如果你不能将\s用于Unicode空格,那就是Ruby正则表达式实现中的一个错误,因为根据UTS#18 “Unicode Regular Expressions” Annex C on Compatibility Properties \s是绝对必需的匹配任何Unicode空白代码点。

由于详细说明标准建议书和POSIX兼容性的两列与\s案例相同,因此不允许摆动。你无法记录下这方面:你不符合Unicode标准,特别是UTS#18的RL1.2a,如果你不这样做的话。

如果您不符合RL1.2a,则不符合1级要求,这是在Unicode上使用正则表达式所需的最基本和基本功能。没有它,你几乎迷失了。 这就是存在标准的原因。我的回忆是Ruby也无法满足其他几个1级要求。因此,如果您确实需要使用正则表达式处理Unicode,则可能希望使用满足至少1级的编程语言。

请注意,您不能使用\p{Zs}之类的Unicode常规类别属性来代表\p{Whitespace}。那是因为Whitespace属性是派生属性,而不是一般类别。其中还包含控制字符,而不仅仅是分隔符。

答案 2 :(得分:2)

  

无论出于什么原因,\ s都不匹配\ u00a0。

我认为“无论什么原因”是不应该的。只有POSIX和\ p构造字符类可识别Unicode。字符级缩写不是:

Sequence   As[...]        Meaning
     \d    [0-9]          ASCII decimal digit character
     \D    [^0-9]         Any character except a digit
     \h    [0-9a-fA-F]    Hexadecimal digit character
     \H    [^0-9a-fA-F]   Any character except a hex digit
     \s    [ \t\r\n\f]    ASCII whitespace character
     \S    [^ \t\r\n\f]   Any character except whitespace
     \w    [A-Za-z0-9\_]  ASCII word character
     \W    [^A-Za-z0-9\_] Any character except a word character

答案 3 :(得分:2)

回答问题的实际运作的IRB代码示例,最新的Rubies(2012年5月)

Ruby 1.9

require 'rubygems'
require 'nokogiri'
RUBY_DESCRIPTION # => "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]"
doc = '<html><body> &nbsp; </body></html>'
page = Nokogiri::HTML(doc)
s = page.inner_text
s.each_codepoint {|c| print c, ' ' } #=> 32 160 32
s.strip.each_codepoint {|c| print c, ' ' } #=> 160
s.gsub(/\s+/,'').each_codepoint {|c| print c, ' ' } #=> 160
s.gsub(/\u00A0/,'').strip.empty? #true

Ruby 1.8

require 'rubygems'
require 'nokogiri'
RUBY_DESCRIPTION # => "ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]"
doc = '<html><body> &nbsp; </body></html>'
page = Nokogiri::HTML(doc)
s = page.inner_text # " \302\240 "
s.gsub(/\s+/,'') # "\302\240"
s.gsub(/\302\240/,'').strip.empty? #true

答案 4 :(得分:1)

对于旧版本的ruby(1.8.x),修复程序是问题中描述的修复程序。

这是在较新版本的ruby 1.9 +中修复的。

答案 5 :(得分:1)

虽然与Ruby无关(而不是与此问题直接相关),但问题的核心可能 Alt + Space on Mac会产生一个不间断的空间。

这可能会导致各种奇怪的行为(特别是在终端中)。

对于那些对更多细节感兴趣的人,我写了#34; Why chaining commands with pipes in Mac OS X does not always work&#34;关于这个话题不久前。