var_dump($checker->isSuspicious('google.com')); // FALSEvar_dump($checker->isSuspicious('Рaypal.com')); // TRUE
为什么 Paypal.com 会返回 true 呢?它哪里可疑了?
实在 isSuspicious() 检测是字符串中的各个字符是否来自不同的 Unicode 字符。大写的 P 是有可能来自于 Cyrylic 这个 Unicode 字符集中,不一定是拉丁字符的那个 P 。当然,这方面的知识做为中国人的我们并不是太理解,除了专门学外语专业或者学习过字母源头干系知识的朋友可能会比较清楚。
既然是国际化的类和方法,那么如果我们修正区域措辞,检测的结果会有不同吗?

$checker->setAllowedLocales('zh_CN');var_dump($checker->areConfusable('google.com', 'goog1e.com')); // truevar_dump($checker->areConfusable('google.com', 'g00g1e.com')); // falsevar_dump($checker->isSuspicious('google.com')); // TRUEvar_dump($checker->isSuspicious('Рaypal.com')); // TRUE
利用 Spoofchecker 的 setAllowedLocales() 方法可以为 Spoofchecker 的操作设置当前的区域措辞信息。在设置为中文后,isSuspicious() 返回的内容都是 TRUE 了,毕竟采取的字符集不同了,都不会走默认的拉丁字符集了。
总结好吧,这篇文章真的只是为了有趣。在实际的业务中,如果我们要做一些文章、代码校验的功能,或许 areConfusable() 能够为我们供应一些便利。大家还是以理解的态度试着玩玩吧!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/9.学习PHP中有趣的字符集国际化验证功能.php
参考文档:
https://www.php.net/manual/zh/class.spoofchecker.php