http://example.com
同様の洗練されたドットを使用したリンクは、IE7、FF3、Opera 9.5、Safari 3、Google Chromeで機能し、IE6では機能しません。
UAX#15:Unicode正規化フォーム
少し考えた後、私は問題の解決策を探し始めました。 ポイントは明らかに難解なユニコード文字のクラスに属していたので(後で学んだように、これは日本語の全角ポイントです)、適切な標準を調べることにしました。 テキストを正規化する手順があり、その後は比較に適していることがわかります。
エキゾチックなキャラクターの構成、分解、変換
Unicodeには4種類の正規化があります。 それらの最初の2つ-構成と分解-は、次の問題に対処できます。
- Unicodeでは、タイプ「Ç」の同じ複雑な文字を2つの形式で表すことができます。1つの文字と、ベース文字(「C」)と修飾子です。 すべての文字が1つに結合されるプロセスは、可能であれば合成と呼ばれ(正規化フォームC、以下NFCと呼びます)、可能な限りすべての文字が修飾子に分割されるプロセスは分解 (正規化フォームD、以下-NFD)と呼ばれます。
- 複数の修飾子がある場合、それらは異なる順序で散在する可能性があります。
- 同じ文字に複数のオプションを含めることができます(たとえば、「Ω」と「Ω」)
上記のすべてを明確にするために、標準からいくつかの例を示します。
次。 上記のように、他の文字と非常によく似ており、スパマーによって悪用される可能性のある多くの文字があります。 特にそのような場合には、正規化形式KC(NFKC)と正規化形式KD(NFKD)があり、(de)構成に加えて、次の文字を正規化します。
- 洗練されたフォント(ℍおよびℌ)
- マグカップ(①)
- サイズと回転角度の変更(カとカ、︷と{)
- 度(⁹および₉)
- 分数(¼)
- その他(™)
実際に見てみましょう:
したがって、NFKC / NFKDは、スパマーやその他の悪霊から保護するためにまさに必要なものです。 これをプログラムに固定するだけです。
実装
- C / C ++用のICUライブラリがあります-C / C ++でユニコードを操作しなければならなかったほとんどの人がそれを知っていると思います。 知らない人のために:ここは公式ウェブサイトです。 ICUでは、すべての正規化はNormalizerクラスを介して行われます。
- Javaには同じICUと同じNormalizerクラスがあります
- PHPの場合、事態はより複雑です。 少なくとも2つの方法を知っています。
- intlライブラリのNormalizerクラスを使用します。
- 何らかの理由でintlライブラリを使用できない場合、独立したサブシステムとして実装されているMediaWikiから完成した実装を ( SVN経由で )取得できます。
簡単な例を挙げます(メイン言語とメインプロジェクトに関連して、指定した最後のライブラリを使用します):
<?php
require_once( 'normal/UtfNormal.php' );
$input = "http://example.com" ;
echo "{$input}\n" ;
echo UtfNormal :: toNFKC ( $input ) . "\n" ;
このプログラムは次を表示します。
http://example.com http://example.com
まとめ
ご覧のように、NFKC / NFKDを使用すると、「文字で遊ぶ」可能性を減らすことができ、スパムフィルターとブロッカーに不可欠です。 NFCでは、テキストを圧縮することもできます。