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

Hon*_*gbo 5 regex unicode validation utf-8 internationalization

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

tch*_*ist 9

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

不要使用Java \p{Alpha},因为那只是ASCII.

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

你可能最好包括\p{Pc} ConnectorPunctuation,以防万一.

如果您拥有Unicode派生属性\p{Diacritic},那么您也应该使用它,因为它包括像加泰罗尼亚语中的成对L's所需的中点和人们有时使用的非组合形式的变音符号.

但是你会发现那些在姓名中使用序号的人\p{Nl}(LetterNumber)不适应,所以你把\p{Nd}(DecimalNumber)甚至全部\pN(Number)投入到混音中.

然后你意识到亚洲名字通常需要在他们的脚本中正确地使用ZWJ或ZWNJ,所以你必须添加U + 200D和U + 200C混合,它们都是\p{Cf}(格式)字符,实际上也是JoinControl那些.

当你完成查找各种各样的Unicode属性以及不断出现的各种奇特角色时 - 或者当你认为自己已经完成时 - 或者- 你几乎肯定会得出结论你会做得更好如果你只是允许他们使用他们想要的名字的任何Unicode字符,就像Tim提到的建议一样.是的,你会得到一些笑话,比如"əɯɐuʇƨɐ⅂əɯɐuʇƨɹᴉℲ",但这只是与领土一致,你不能以任何合理的方式排除愚蠢的名字.

  • 我不知道我更喜欢这个答案更多的事实:它实际上确实回答了这个问题,它可能会教授很多关于unicode正则表达式的事实,或者它简洁地说明了为什么要尝试验证真实姓名是个坏主意. (2认同)