使用UTF-8编码进行多语言输入验证

时间:2010-12-01 10:31:53

标签: regex validation unicode utf-8 internationalization

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

3 个答案:

答案 0 :(得分:9)

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

不要使用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's所需的中点和非有时会出现的变音符号的组合形式使用

但是你会发现那些在\p{Nl} LetterNumber )不适应的方式中使用序号的人,所以你抛出\p{Nd}(< em> DecimalNumber )甚至是{{1>}( Number )的所有内容。

然后你意识到亚洲名字经常需要在他们的脚本中正确地使用ZWJ或ZWNJ,所以你必须添加U + 200D和U + 200C混合,这两者都是\pN格式)字符,实际上还有 JoinControl 字符。

当你完成looking up the various Unicode properties时,各种各样的奇异角色不断出现 - 或者当你思考时,你已经完成了 - 而你 - 几乎可以肯定得出结论,如果你只是允许他们使用他们希望的名字的任何Unicode字符,你会做得更好,正如the link Tim cites建议的那样。是的,你会得到一些像“ɯɐɯɐuʇƨɐ⅂əɯɐuʇƨɹᴉℲ”这样的东西,但这只是与领土一致,你不能以任何合理的方式排除愚蠢的名字。

答案 1 :(得分:3)

考虑一下您是否真的需要验证用户名。也许你应该让用户自己打电话给自己。

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

答案 2 :(得分:0)

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

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

包括“变音符号”(即'ä','ö'等)加上重音元音(è,í等)。 但是,对于西里尔语(俄罗斯,保加利亚......)或中文字符的验证不足......