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

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

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

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

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

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

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

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

使用/[[:space:]]/匹配所有空格,包括Unicode空格,如非破坏空格。 这与/\s/ ,它只匹配ASCII空格。

另请参见: Ruby Regexp文档

如果您不能将\s用于Unicode空格,那么这是Ruby正则表达式实现中的一个错误,因为根据UTS#18“Unicode正则表达式”附录C关于兼容性属性 a \s绝对需要匹配任何Unicode空白代码点。

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

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

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

无论出于什么原因,\ 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 

使用最新Rubies回答问题的实际functionIRB代码示例(2012年5月)

Ruby 1.9

 require 'rubygems' require 'nokogiri' RUBY_DESCRIPTION # => "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]" doc = '   ' 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 = '   ' page = Nokogiri::HTML(doc) s = page.inner_text # " \302\240 " s.gsub(/\s+/,'') # "\302\240" s.gsub(/\302\240/,'').strip.empty? #true 

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

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

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

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

对于那些对更多细节感兴趣的人,我写了一篇“ 为什么在Mac OS X中用管道链接命令并不总是有用”这个主题不久前。