PHPで面白い文字セットの国際化検証機能を学ぶ

2739 ワード

今日の内容はとても簡単ですが、おもしろいです.皆さんはこのようなことを経験したことがあるかどうか分かりませんが、いくつかのフォントの下で、0とOは区別しにくく、1とlもはっきり見えません.もちろん、ほとんどのエディタとIDEのデフォルトフォントでは、0の間にスラッシュや点を付けるなど、似たような文字を区別しやすいものが選択されています.PHPにもこのような区別の悪い文字が存在するかどうかを調べるのに役立つ関数があります.
類似文字検出
$checker = new Spoofchecker();

var_dump($checker->areConfusable('google.com', 'goog1e.com')); // true

var_dump($checker->areConfusable('google.com', 'g00g1e.com')); // false

Spoofcheckerクラスは、このような検出を行うためのクラスであり、areConfusable()メソッドは、2つの文字列に類似する文字があるかどうかを検出するのに役立ちます.例えば、私たちの最初のテストコードの中で、lと1は、よく見なければ間違いを認める可能性があります.2番目のセグメントの検出コードが返すfalseは、非常に似たような文字が存在しないことを示していますが、最初の文字列の小文字のoを大文字のOに置き換えると、このセグメントもtrueを返します.みんなは自分でテストしてもいいです.
疑わしい文字検出
さらに,Spoofcheckerクラスの別の方法を用いて,文字列に不審な文字があるかどうかを検出することができる.
var_dump($checker->isSuspicious('google.com')); // FALSE

var_dump($checker->isSuspicious('Рaypal.com')); // TRUE

なぜ?comはtrueを返しますか?どこが怪しいの?
実はisSuspicious()は、文字列の各文字が異なるUnicode文字から来ているかどうかを検出します.大文字のPはCyrylicというUnicode文字セットから来る可能性があり、必ずしもラテン文字のPではない.もちろん、この方面の知识は中国人の私达としてあまり理解していないで、専门的に外国语の専门を学んであるいはアルファベットの源の関连する知识の友达を学んだことがある以外は比较的に明らかかもしれません.
異なる領域言語での効果
国際化されたクラスと方法である以上、地域言語を修正すると、検出結果は異なりますか?

$checker->setAllowedLocales('zh_CN');

var_dump($checker->areConfusable('google.com', 'goog1e.com')); // true

var_dump($checker->areConfusable('google.com', 'g00g1e.com')); // false

var_dump($checker->isSuspicious('google.com')); // TRUE

var_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
各メディアプラットフォームで検索可能【ハードコアプロジェクトマネージャ】