1 に答える
あなたの最初の質問は、同じエンコーディング (UTF-8) を持つ 2 つの同一の単語が、それにもかかわらず異なるというのはどうしてでしょうか?
この場合、どちらの場合もエンコーディングは実際には UTF-8 ではありません。最初の変数は「実際の」UTF-8 ですが、2 番目のギリシャ文字は実際には UTF-8 ではなく ASCII であり、非 ASCII 文字 (ギリシャ語) は CER (Character Entity Reference) と呼ばれるものを使用してエンコードされています。 .
Web ブラウザと使いやすい "WYSIWYG" エディタは、これらの文字列を同一のものとしてレンダリングしますが、実際の文字列のバイナリ表現 (コンピュータが比較するもの) は異なります。これが、ブラウザーまたはエディターでの人間の視覚的検査では文字列が同じに見える場合でも、等しいテストが失敗する理由です。
mb_detect_encoding
CERを使用して非ASCIIを表すASCIIとutf-8を区別する方法がないため、このような場合にエンコーディングを検出するために頼ることができるとは思いません。
2 番目の質問は、「この問題を解決するにはどうすればよいですか?」というものでした。
異なる方法でエンコードされている可能性のある文字列を比較する前に、バイナリ表現が同一になるように正規形式 ( Wikipedia: Canonicalization )に変換する必要があります。
これが私がそれを解決した方法です:私は、utf8_normalize
ほぼすべての一般的な文字表現(私の場合:CER、NER、iso-8859-1、およびCP-1252)を正規のutf-8に変換するという名前の便利な関数を実装しました文字列の比較。そこに投入するものは、ソフトウェアが動作する環境のタイプで「一般的な」文字表現が何であるかによってある程度決定する必要がありますが、比較する前に文字列が正規の形式であることを確認するだけで機能します.
以下の OP ( phpheini ) のコメントにあるように、 PHP ノーマライザー クラスも存在します。