3
#!/usr/local/bin/perl
use warnings;
use 5.014;
use Unicode::Normalize qw(NFD NFC compose);


my $string1 = "\x{f5}";

my $NFD_string1 = NFD( $string1 ); 
# PV = 0x831150 "o\314\203"\0 [UTF8 "o\x{303}"] *

my $composed_NFD_string1 = compose( $NFD_string1 ); 
#  PV = 0x77bc40 "\303\265"\0 [UTF8 "\x{f5}"] *

my $NFC_string1 = NFC( $string1 );
#  PV = 0x836e30 "\303\265"\0 [UTF8 "\x{f5}"] *


my $string2 = "o\x{303}";

my $NFD_string2 = NFD( $string2 );
#  PV = 0x780da0 "o\314\203"\0 [UTF8 "o\x{303}"] *

my $composed_NFD_string2 = compose( $NFD_string2 ); 
#  PV = 0x782dc0 "\303\265"\0 [UTF8 "\x{f5}"] *  

my $NFC_string2 = NFC( $string2 );
#  PV = 0x7acba0 "\303\265"\0 [UTF8 "\x{f5}"] * 

# * from Devel::Peek::Dump output


say 'OK' if $NFD_string1 eq $NFD_string2;
say 'OK' if $NFC_string1 eq $NFC_string2;

出力:

OK
OK

これを試した後、私は尋ねました: のNormalization Form D代わりにを使用する理由はありNormalization Form Cますか?

4

1 に答える 1

3

すべてが複合形式を持っているわけではなく、NFC は実際には最初に NFD を行います。NFD の一部では、開始文字の後に継続文字を順番に配置しているため、2 つの書記素クラスター (開始文字とその継続文字の派手な名前) を比較して、それらが同じかどうかを確認できます。この例で行っていることについては、同じ答えが得られるはずですが、NFC は実際にはより多くの作業を行います。

一部の製品に特別な NFC バージョンがない理由はいくつかあります。それらの多くは、歴史的な文字セットから来ています。é の構成バージョンは、Latin-1 の人々を幸せにするためにあります。自分で書記素を作成できるように設計された e および ´ バージョンもあります。それを行うには多くの方法があり、アクセントや分音記号だけではありません。書記素クラスターは、これらの継続文字をいくつか持つことができ、それらを自分で作成するときに、好きな順序で配置できます (何らかの理由で)。ただし、重みが割り当てられています。NFD はそれらを重みで並べ替えるので、使用した順序に関係なく 2 つの書記素クラスターを比較できます。

daxim がコメントで述べたように、それはすべてUnicode Technical Report 15にあります。図を見て、次の部分を読んでください。

文字列が完全に分解されると、文字列に含まれる結合記号のシーケンスが明確に定義された順序に配置されます。この結合マークの再配置は、正規順序付けアルゴリズムとして知られる Unicode 正規化アルゴリズムのサブパートに従って行われます。このアルゴリズムは、UnicodeData.txt にも定義されている値の Canonical_Combining_Class (ccc) プロパティの値に基づいて結合マークのシーケンスを並べ替えます。ほとんどの文字 (すべての非結合マークを含む) の Canonical_Combining_Class 値はゼロであり、Canonical Ordering Algorithm の影響を受けません。このような文字は、スターターという特別な用語で呼ばれます。ゼロ以外の Canonical_Combining_Class プロパティ値を持つ結合マークのサブセットのみが、Canonical Ordering Algorithm による潜在的な並べ替えの対象となります。

HFS+ ファイル システムなど、データに明示的に NFD を使用するものもあります。多くの場合、プログラミング言語はおそらくファイル名文字列を正しい形式に変換するライブラリ関数にバインドされているため、これはあまり重要ではありません。

今日のどこかで、これらのことの多くを示すUnicode::Supportをアップロードする予定です。

そして、今日、トムがやって来て、私たち全員を教育します。:)

于 2011-07-21T19:33:00.653 に答える