【问题标题】:Special characters replaced with '?'特殊字符替换为“?”
【发布时间】:2012-11-16 09:49:39
【问题描述】:

我有一个简单的 html 表单,我想提交。它是登录表单。我在 ruby​​ on rails 控制器上提交它。 当其中一个输入(电子邮件)的值中有一些特殊字符时,例如 č、ć、đ、š 或 ž。这些字符被替换为 ?特点。

如果我在输入字段 user?@domain.com 中有值,它将不会通过针对 "/\A[\w\d._%-]+\@[\w\d.-]+.[ 的评估\w]{2,4}\z/"

但例如,值 userž@domain.com 在 ruby​​ 代码中被视为 user?@domain.com (使用 puts 方法),它通过了上面提到的正则表达式验证。

我正在使用 jruby 1.6.5.1 和 Rails 2.3.8

有谁知道这是怎么回事?

【问题讨论】:

  • Ruby 编码支持随着上一个主要版本而改变,因此提供您的 Ruby 和 Rails 版本可能会有用。
  • 我认为 č、ć 等显示为 '?'在您的示例中,但它们仍然是相同的字符。或者您的意思是当它们最终存储在数据库中时,电子邮件将存储为“?”而不是 č、ć 等?
  • 它永远不会进入数据库。我使用 puts 方法在控制台中查看它。
  • 该值仍然有 č、ć 等,但这些字符显示为例如puts as '?',我不太明白你的问题是什么。
  • 问题是如何获取真实值?所以我可以执行验证以避免提到的字符。

标签: ruby-on-rails forms post special-characters


【解决方案1】:

\w 在正则表达式中似乎也可以捕获 č、ć 等(unicode 字符)。如果你只想要“普通”字符,你应该使用A-Za-z0-9_,那么你的正则表达式将是

/\A[A-Za-z\d._%-]+\@[A-Za-z0-9_.-]+.[A-Za-z0-9_]{2,4}\z/

不需要 0-9,因为您在 [] 中已经有 \d。但如果我应该写它,我也会使用 0-9 来使其更具可读性,我更喜欢 ^$ 而不是 \A\z。那将是(加上一些其他的小调整):

/^[A-Za-z0-9_.%-]+\@[A-Za-z0-9_.-]+.[A-Za-z]{2,4}$/

我不确定您为什么在正则表达式中允许%? (在您的问题中包含在您的正则表达式中)。

编辑: 我做了一些搜索,根据平台的不同,Regexp 中的 unicode 字符的行为似乎有所不同。据我了解,例如在 Java 中 \w 仅限于 [A-Za-z0-9_],但在其他平台中,unicode 字符可以包含在 \w 中。这是我从以下链接中发现的:

这里有一些链接:

Matching (e.g.) a Unicode letter with Java regexps

在那个帖子中我找到了这些链接:

(和这个问题差不多)Unicode equivalents for \w and \b in Java regular expressions?

(来自正则表达式教程)http://www.regular-expressions.info/unicode.html

【讨论】: