【问题标题】:Multi-language input validation with UTF-8 encoding使用 UTF-8 编码的多语言输入验证
【发布时间】:2011-05-18 10:14:36
【问题描述】:

为了检查用户输入的英文名称是否有效,我通常会将输入与正则表达式进行匹配,例如 [A-Za-z]。但是,如果 utf8 编码需要多语言(如中文、日文等)支持,我该怎么做呢?

【问题讨论】:

  • 你使用什么语言/正则表达式实现?
  • 理想情况下支持所有语言,这可能吗?
  • 我认为 Gumbo 的意思是“你使用什么编程语言?”
  • 阅读this。

标签: regex validation unicode utf-8 internationalization


【解决方案1】:

如果您的语言不直接支持正确的 Alphabetic 属性,您可以使用 [\pL\pM\p{Nl}] 非常简洁地近似 Unicode 派生属性 \p{Alphabetic}。

不要使用 Java 的\p{Alpha},因为that’s ASCII-only。

但是您会注意到您没有考虑破折号(\p{Pd} 或 DashPunctuation 有效,但 不 包括大多数连字符! )、撇号(通常但不总是 U+27、U+2BC、U+2019 或 U+FF07 之一)、逗号或句号/句号。

您最好包括\p{Pc}ConnectorPunctuation,以防万一。

如果您有 Unicode 派生属性 \p{Diacritic},您也应该使用它,因为它包括诸如加泰罗尼亚语中双音 L 所需的中点和人们有时使用的非组合形式的变音符号之类的东西。

但是你会发现有人在他们的名字中使用序数,而 \p{Nl} (LetterNumber) 不适合,所以你抛出 \p{Nd} (DecimalNumber) 甚至所有 \pN (Number) 都混在一起。

然后你意识到亚洲名字通常需要在他们的脚本中正确书写 ZWJ 或 ZWNJ,所以你必须添加 U+200D 和 U+200C,它们都是 \p{Cf} (Format) 字符,实际上还有 JoinControl 字符。

当你完成 looking up the various Unicode properties 的各种奇特角色不断出现的时候——或者当你认为你已经完成了,而是——你几乎肯定会得出结论正如the link Tim cites 所建议的那样,如果您只是允许他们使用他们希望的任何Unicode 字符作为他们的名字,那么您会在这方面做得更好。是的,你会看到一些小丑用诸如“əɯɐuʇƨɐ⅂ əɯɐuʇƨɹᴉℲ”之类的东西,但这只是与领土有关,你不能以任何合理的方式排除愚蠢的名字。

【讨论】:

  • 我不知道我更喜欢这个答案的哪一点:它确实回答了这个问题,它可能会教授很多关于 unicode 正则表达式的知识,或者事实上它简洁地说明了为什么尝试验证真实姓名是一个坏主意。
【解决方案2】:

考虑您是否真的需要验证用户名。也许你应该让用户随意称呼自己。

你当然不应该使用[A-Za-z],因为有些人的名字带有撇号或连字符。阻止某人使用他们的真实姓名可能是非常侮辱人的,因为它不遵循您对姓名应该是什么样的任意规则。

【讨论】:

    【解决方案3】:

    在 PHP 中,我使用了这个讨厌的 hack:

     setlocale(LC_ALL, 'de_DE');
     preg_match('/^[[:alpha:]]+$/', $name);
    

    这包括“元音变音”(即“ä”、“ö”等)以及重读元音(è、í 等)。 但验证西里尔字母(俄罗斯、保加利亚……)或汉字的能力不足……

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      相关资源
      最近更新 更多