Unicode正規化

かつて、スパマーが非常に興味深い方法でスパムフィルターを回避する方法を見なければなりませんでした。 「example.com」のような従来のURLの代わりに、リンクは次のようになりました。

http://example.com

同様の洗練されたドットを使用したリンクは、IE7、FF3、Opera 9.5、Safari 3、Google Chromeで機能し、IE6では機能しません。



UAX#15:Unicode正規化フォーム



少し考えた後、私は問題の解決策を探し始めました。 ポイントは明らかに難解なユニコード文字のクラスに属していたので(後で学んだように、これは日本語の全角ポイントです)、適切な標準を調べることにしました。 テキストを正規化する手順があり、その後は比較に適していることがわかります。



エキゾチックなキャラクターの構成、分解、変換



Unicodeには4種類の正規化があります。 それらの最初の2つ-構成と分解-は、次の問題に対処できます。



上記のすべてを明確にするために、標準からいくつかの例を示します。

NFC  NFD

NFC  NFD

次。 上記のように、他の文字と非常によく似ており、スパマーによって悪用される可能性のある多くの文字があります。 特にそのような場合には、正規化形式KC(NFKC)と正規化形式KD(NFKD)があり、(de)構成に加えて、次の文字を正規化します。



実際に見てみましょう:

NFKC  NFKD

したがって、NFKC / NFKDは、スパマーやその他の悪霊から保護するためにまさに必要なものです。 これをプログラムに固定するだけです。

実装

  1. C / C ++用のICUライブラリがあります-C / C ++でユニコードを操作しなければならなかったほとんどの人がそれを知っていると思います。 知らない人のために:ここは公式ウェブサイトです。 ICUでは、すべての正規化はNormalizerクラスを介して行われます。
  2. Javaには同じICUと同じNormalizerクラスがあります
  3. PHPの場合、事態はより複雑です。 少なくとも2つの方法を知っています。



簡単な例を挙げます(メイン言語とメインプロジェクトに関連して、指定した最後のライブラリを使用します):

<?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では、テキストを圧縮することもできます。




All Articles