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

Coo*_*J86 27 ruby unicode whitespace json utf-8

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

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

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

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

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

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

Jo *_*iss 40

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

使用/[[:space:]]/以匹配所有的空白,包括Unicode空白像非换空间.这与之不同/\s/,它只匹配ASCII空格.

另请参阅:Ruby Regexp文档

  • @JoLiss你的答案是正确的,但你的"自我记录"缺少尾随结肠.我自己多次犯了同样的错误. (2认同)

tch*_*ist 6

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

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

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

请注意,您不能使用Unicode通用类别属性一样\p{Zs}放置\p{Whitespace}.那是因为Whitespace属性是派生属性,而不是一般类别.还包含控制字符,而不仅仅是分隔符.


Coo*_*J86 1

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

此问题已在较新版本的 ruby​​ 1.9+ 中修复。