[php] 正規化されたUTF-8とは何ですか?



2 Answers

いくつかの文字、例えば、アクセント記号(例えば、 é )を持つ文字は、単一のコードポイントU+00E9または普通の文字の後に結合アクセント記号U+0065 U+0301 2通りの方法で表すことができます。 通常の正規化では、これらのうちの1つを常に表すように選択します(NFCの単一コードポイント、NFDの結合フォーム)。

複数の基本文字列と結合記号(例えば、「s、下のドット、上のドット、下にドットを置く、または既にドットの1つを持つ基本文字を使用する)で表現できる文字については、NFDはまた、これらのうちの1つを選択します(下が最初に起こります)

互換性分解には、実際には文字ではないが、従来のエンコーディングで使用されていた文字が含まれています。 通常の正規化ではこれらを統一することはできません(往復の完全性を維持するために) - これは結合形式の問題ではありません。 いくつかの東アジアのエンコーディング(または半角/全角カタカナとアルファベット)、またはMacRomanの "fi"合字に表示される "kg"キログラムのように考えてください。

詳細はhttp://unicode.org/reports/tr15/を参照してください。

Question

ICUプロジェクト (現在はPHPライブラリを持っています )には、検索時に値を比較しやすくするためにUTF-8文字列を正規化するのに必要なクラスが含まれています。

しかし、私はアプリケーションのためにこれが何を意味するの理解しようとしてます。 たとえば、「Compatibility equivalence」の代わりに「Canonical Equivalence」を使用する場合、またはその逆の場合は、




これは実際にはかなり簡単です。 UTF-8には、実際には同じ「文字」の表現がいくつかあります。 (私は引用符で文字を使用しています。なぜならそれらはバイト単位では異なるためですが、実際は同じです)。 例はリンクされた文書で与えられます。

文字 "Ç"は、バイト列0xc387として表すことができます。 しかし、 C (0x43)とそれに続くバイトシーケンス0x8ccca7で表すこともできます。 つまり、0xc387と0x438ccca7は同じ文字です。 その理由は、0x8ccca7が結合マークであることです。 それはそれの前のキャラクター(ここではC )をとり、それを修正します。

さて、正規の等価性と互換性の同等性との違いについては、一般的に文字を見る必要があります。

を介して意味を伝える文字と、別の文字を取り込んで変更する文字の2種類があります。 したがって、9は意味のある文字です。 スーパースクリプトはその意味を持ち、それをプレゼンテーションで変更します。 標準的には意味が異なりますが、それでも基本的なキャラクターを表しています。

したがって、標準的な同値性は、バイトシーケンスが同じ意味を持つ同じ文字をレンダリングするところです。 互換性の同等性は、バイトシーケンスが(たとえ変更されていても)同じ基本的な意味を持つ異なる文字をレンダリングしている場合です。 したがって、9と9は両方とも "9"を意味するため互換性がありますが、同じ表現を持たないため、標準的には同等ではありません...

希望は役立ちます...




2つのユニコード文字列が正準に等しい場合、文字列は実際には同じで、異なるユニコード文字列を使用するだけです。 たとえば、Äは、文字ÄまたはAとcombinationの組み合わせを使用して表すことができます。

文字列が互換性があるだけの場合、文字列は必ずしも同じではありませんが、いくつかのコンテキストでは同じである可能性があります。 例えばffはffと同じとみなすことができる。

したがって、文字列を比較している場合、互換性の同等性は実際の等価性ではないため、標準的な等価性を使用する必要があります。

しかし、文字列のセットをソートしたい場合は、互換性等価性を使用するのが理想的です。




Related