要检查用户输入英文名称是否有效,我通常会将输入与正则表达式匹配,例如[A-Za-z]。但是如果使用utf8编码需要支持多语言(如中文,日文等),我该怎么办呢?
答案 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);
包括“变音符号”(即'ä','ö'等)加上重音元音(è,í等)。 但是,对于西里尔语(俄罗斯,保加利亚......)或中文字符的验证不足......