我的情况是,当编码为utf-8 json时,来自html textarea或输入的用户输入数据有时会与\u00a0
(非中断空格)而不是空格一起发送。
我认为这是Firefox中的一个错误,因为我知道用户不是故意放入不间断的空格而不是空格。
Ruby中还有两个错误,其中一个可以用来对抗另一个错误。
无论出于何种原因,\s
都不匹配\u00a0
。
但[^[:print:]]
,绝对不应该匹配)和\xC2\xA0
两者都匹配,但我认为这些方法不是理想的方法来处理这个问题。
是否有其他建议可以解决此问题?
答案 0 :(得分:40)
使用/\u00a0/
匹配不间断的空格。例如,s.gsub(/\u00a0/, ' ')
将所有非中断空格转换为常规空格。
使用/[[:space:]]/
匹配所有空格,包括Unicode空格,如非中断空格。这与/\s/
不同,{{1}}仅匹配ASCII空格。
答案 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> </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> </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;关于这个话题不久前。