Unicode正規化について知りたくないことすべて
正規化
Unicodeには、いくつかの文字、特にアクセント付き文字をエンコードする複数の方法が含まれています。正規正規化は、コードポイントを正規エンコード形式に変更します。結果のコードポイントは、フォントやレンダリングエンジンのバグを除いて、元のコードポイントと同じように見えるはずです。
いつ使用するか
結果は同一に見えるため、結果が入力とビットごとに同一でないことを許容できる限り、文字列を保存または表示する前に正規正規化を適用しても常に安全です。
正規化には、NFDとNFCの2つの形式があります。この2つは、これら2つの形式間で損失なく変換できるという意味で同等です。NFCで2つの文字列を比較すると、常にNFDで比較した場合と同じ結果になります。
NFD
NFDのキャラクターは完全に拡張されています。これは、計算するのに高速な正規化形式ですが、結果としてコードポイントが多くなります(つまり、より多くのスペースを使用します)。
まだ正規化されていない2つの文字列を比較するだけの場合は、互換性の正規化が必要であることがわかっている場合を除き、これが推奨される正規化形式です。
NFC
NFCは、NFDアルゴリズムの実行後、可能な場合にコードポイントを再結合します。これには少し時間がかかりますが、文字列は短くなります。
互換性の正規化
Unicodeには、実際には属さないが、従来の文字セットで使用されていた多くの文字も含まれています。Unicodeはこれらを追加して、これらの文字セットのテキストをUnicodeとして処理し、損失なしで元に戻すことができるようにしました。
互換性の正規化は、これらを「実際の」文字の対応するシーケンスに変換し、正規の正規化も実行します。互換性の正規化の結果は、オリジナルと同じに見えない場合があります。
フォーマット情報を含む文字は、含まない文字に置き換えられます。たとえば、文字⁹
はに変換され9
ます。他のものはフォーマットの違いを含みません。たとえば、ローマ数字の文字Ⅸ
は通常の文字に変換されますIX
ます。
明らかに、この変換が実行されると、元の文字セットに無損失で変換することはできなくなります。
いつ使うか
Unicodeコンソーシアムは、ToUpperCase
変換のような互換性の正規化について考えることを提案しています。状況によっては便利な場合もありますが、そのまま適用してはなりません。
9
一致するものを検索したいので、優れたユースケースは検索エンジンです。⁹
。
おそらくすべきでないことの1つは、互換性の正規化をユーザーに適用した結果を表示することです。
NFKC / NFKD
互換性正規化形式には、NFKDとNFKCの2つの形式があります。NFDとCの間の関係と同じです。
NFKCの文字列は、本質的にNFCにもあり、NFKDとNFDでも同じです。このようにNFKD(x)=NFD(NFKC(x))
、そしてNFKC(x)=NFC(NFKD(x))
、など
結論
疑問がある場合は、正規化を行ってください。適用可能なスペース/速度のトレードオフに基づいて、または相互運用しているものに必要なものに基づいて、NFCまたはNFDを選択します。