Unicode::Normalize - Unicode 標準化格式
(1) 使用預設匯出的函式名稱
use Unicode::Normalize;
$NFD_string = NFD($string); # Normalization Form D
$NFC_string = NFC($string); # Normalization Form C
$NFKD_string = NFKD($string); # Normalization Form KD
$NFKC_string = NFKC($string); # Normalization Form KC
(2) 使用依要求匯出的函式名稱
use Unicode::Normalize 'normalize';
$NFD_string = normalize('D', $string); # Normalization Form D
$NFC_string = normalize('C', $string); # Normalization Form C
$NFKD_string = normalize('KD', $string); # Normalization Form KD
$NFKC_string = normalize('KC', $string); # Normalization Form KC
參數
$string
用於字元語意下的字串 (請參閱 perlunicode)。
$code_point
應為代表 Unicode 碼點的無符號整數。
注意:XSUB 與純 Perl 之間,對於將 $code_point
解釋為十進位數字的方式有不相容之處。XSUB 會將 $code_point
轉換為無符號整數,但純 Perl 沒有。請勿在 $code_point
中使用浮點數或負號。
$NFD_string = NFD($string)
它傳回正規化形式 D(由正規分解形成)。
$NFC_string = NFC($string)
它傳回正規化形式 C(由正規分解形成,然後進行正規組合)。
$NFKD_string = NFKD($string)
它傳回正規化形式 KD(由相容性分解形成)。
$NFKC_string = NFKC($string)
它傳回正規化形式 KC(由相容性分解形成,然後進行正規組合)。
$FCD_string = FCD($string)
如果給定的字串為 FCD(「快速 C 或 D」形式;請參閱 UTN #5),它會傳回未修改的字串;否則,它會傳回一個 FCD 字串。
注意:FCD 不總是唯一的,因此複數形式可能彼此相等。FCD()
會傳回這些等效形式之一。
$FCC_string = FCC($string)
它傳回 FCC 形式(「快速 C 連續」;請參閱 UTN #5)。
注意:FCC 是唯一的,就像四種正規化形式 (NF*) 一樣。
$normalized_string = normalize($form_name, $string)
它傳回 $form_name
的正規化形式。
作為 $form_name
,必須提供下列名稱之一。
'C' or 'NFC' for Normalization Form C (UAX #15)
'D' or 'NFD' for Normalization Form D (UAX #15)
'KC' or 'NFKC' for Normalization Form KC (UAX #15)
'KD' or 'NFKD' for Normalization Form KD (UAX #15)
'FCD' for "Fast C or D" Form (UTN #5)
'FCC' for "Fast C Contiguous" (UTN #5)
$decomposed_string = decompose($string [, $useCompatMapping])
它傳回字串中每個字元的分解串接。
如果省略第二個參數(布林值)或為 false,分解就是正規分解;如果第二個參數(布林值)為 true,分解就是相容性分解。
傳回的字串不總是 NFD/NFKD。可能需要重新排序。
$NFD_string = reorder(decompose($string)); # eq. to NFD()
$NFKD_string = reorder(decompose($string, TRUE)); # eq. to NFKD()
$reordered_string = reorder($string)
它傳回根據正規排序行為重新排序組合字元的結果。
例如,當您有 NFD/NFKD 字串清單時,您可以透過說,從中取得串接的 NFD/NFKD 字串
$concat_NFD = reorder(join '', @NFD_strings);
$concat_NFKD = reorder(join '', @NFKD_strings);
$composed_string = compose($string)
它傳回正規組合的結果,而不套用任何分解。
例如,當您有 NFD/NFKD 字串時,您可以透過說,取得其 NFC/NFKC 字串
$NFC_string = compose($NFD_string);
$NFKC_string = compose($NFKD_string);
($processed, $unprocessed) = splitOnLastStarter($normalized)
它回傳兩個字串:第一個,$processed
,是最後一個起始符號之前的部分,第二個,$unprocessed
是第一部分之後的另一部分。起始符號是一個組合類別為零的字元(請參閱 UAX #15)。
請注意,$processed
可能為空(當 $normalized
不包含起始符號或以最後一個起始符號開頭時),然後 $unprocessed
應等於整個 $normalized
。
當您有一個 $normalized
字串和一個緊接在後的 $unnormalized
字串時,一個簡單的串接是錯誤的
$concat = $normalized . normalize($form, $unnormalized); # wrong!
請改用以下方式
($processed, $unprocessed) = splitOnLastStarter($normalized);
$concat = $processed . normalize($form,$unprocessed.$unnormalized);
splitOnLastStarter()
應使用預先正規化的參數 $normalized
呼叫,其形式與您想要的 $form
相同。
如果您有一個 @string
陣列應該先串接再正規化,您可以這樣做
my $result = "";
my $unproc = "";
foreach my $str (@string) {
$unproc .= $str;
my $n = normalize($form, $unproc);
my($p, $u) = splitOnLastStarter($n);
$result .= $p;
$unproc = $u;
}
$result .= $unproc;
# instead of normalize($form, join('', @string))
$processed = normalize_partial($form, $unprocessed)
normalize()
和 splitOnLastStarter()
組合的包裝器。請注意,$unprocessed
將作為副作用進行修改。
如果您有一個 @string
陣列應該先串接再正規化,您可以這樣做
my $result = "";
my $unproc = "";
foreach my $str (@string) {
$unproc .= $str;
$result .= normalize_partial($form, $unproc);
}
$result .= $unproc;
# instead of normalize($form, join('', @string))
$processed = NFD_partial($unprocessed)
它像 normalize_partial('NFD', $unprocessed)
。請注意,$unprocessed
將作為副作用進行修改。
$processed = NFC_partial($unprocessed)
它像 normalize_partial('NFC', $unprocessed)
。請注意,$unprocessed
將作為副作用進行修改。
$processed = NFKD_partial($unprocessed)
它像 normalize_partial('NFKD', $unprocessed)
。請注意,$unprocessed
將作為副作用進行修改。
$processed = NFKC_partial($unprocessed)
它像 normalize_partial('NFKC', $unprocessed)
。請注意,$unprocessed
將作為副作用進行修改。
(請參閱附錄 8,UAX #15;和 lib/unicore/DerivedNormalizationProps.txt)
以下函式檢查字串是否為該正規化形式。
回傳的結果將是下列之一
YES The string is in that normalization form.
NO The string is not in that normalization form.
MAYBE Dubious. Maybe yes, maybe no.
$result = checkNFD($string)
如果為 YES
,則回傳 true (1
);如果為 NO
,則回傳 false (空字串
)。
$result = checkNFC($string)
如果為 YES
,則傳回 true (1
);如果為 NO
,則傳回 false (空字串
);如果為 MAYBE
,則傳回 undef
。
$result = checkNFKD($string)
如果為 YES
,則回傳 true (1
);如果為 NO
,則回傳 false (空字串
)。
$result = checkNFKC($string)
如果為 YES
,則傳回 true (1
);如果為 NO
,則傳回 false (空字串
);如果為 MAYBE
,則傳回 undef
。
$result = checkFCD($string)
如果為 YES
,則回傳 true (1
);如果為 NO
,則回傳 false (空字串
)。
$result = checkFCC($string)
如果為 YES
,則傳回 true (1
);如果為 NO
,則傳回 false (空字串
);如果為 MAYBE
,則傳回 undef
。
注意:如果字串不在 FCD 中,則它一定不在 FCC 中。因此 checkFCC($not_FCD_string)
應該傳回 NO
。
$result = check($form_name, $string)
如果為 YES
,則傳回 true (1
);如果為 NO
,則傳回 false (空字串
);如果為 MAYBE
,則傳回 undef
。
作為 $form_name
,必須提供下列名稱之一。
'C' or 'NFC' for Normalization Form C (UAX #15)
'D' or 'NFD' for Normalization Form D (UAX #15)
'KC' or 'NFKC' for Normalization Form KC (UAX #15)
'KD' or 'NFKD' for Normalization Form KD (UAX #15)
'FCD' for "Fast C or D" Form (UTN #5)
'FCC' for "Fast C Contiguous" (UTN #5)
注意
在 NFD、NFKD 和 FCD 的情況下,答案必須為 YES
或 NO
。在 NFC、NFKC 和 FCC 的情況下,可能會傳回 MAYBE
答案。
MAYBE
字串應至少包含一個組合字元或類似字元。例如,組合銳音符
具有 MAYBE_NFC/MAYBE_NFKC 屬性。
checkNFC("A\N{COMBINING ACUTE ACCENT}")
和 checkNFC("B\N{COMBINING ACUTE ACCENT}")
都會傳回 MAYBE
。"A\N{COMBINING ACUTE ACCENT}"
不在 NFC 中(其 NFC 為 "\N{LATIN CAPITAL LETTER A WITH ACUTE}"
),而 "B\N{COMBINING ACUTE ACCENT}"
在 NFC 中。
如果您想要精確檢查,請將字串與其 NFC/NFKC/FCC 進行比較。
if ($string eq NFC($string)) {
# $string is exactly normalized in NFC;
} else {
# $string is not normalized in NFC;
}
if ($string eq NFKC($string)) {
# $string is exactly normalized in NFKC;
} else {
# $string is not normalized in NFKC;
}
這些函式是內部使用的字元資料介面。如果您只想取得 Unicode 正規化形式,則不需要自己呼叫它們。
$canonical_decomposition = getCanon($code_point)
如果字元可以正規分解(包括韓文字母),則傳回(完整的)正規分解作為字串。否則傳回 undef
。
注意:根據 Unicode 標準,不可正規分解的字元的正規分解與字元本身相同。
$compatibility_decomposition = getCompat($code_point)
如果字元可相容分解(包括韓文字節),它會傳回(完整的)相容分解作為字串。否則,它會傳回 undef
。
注意:根據 Unicode 標準,不可相容分解的字元的相容分解與字元本身相同。
$code_point_composite = getComposite($code_point_here, $code_point_next)
如果這裡和下一個兩個字元(作為代碼點)可組合(包括韓文字母/音節和組合排除),它會傳回複合代碼點。
如果它們不可組合,它會傳回 undef
。
$combining_class = getCombinClass($code_point)
它會傳回字元的組合類別(作為整數)。
$may_be_composed_with_prev_char = isComp2nd($code_point)
它會傳回一個布林值,表示指定代碼點的字元是否可以在特定組合中與前一個字元組合(包括韓文組合,但不包括組合排除和非起始分解)。
$is_exclusion = isExclusion($code_point)
它會傳回一個布林值,表示代碼點是否為組合排除。
$is_singleton = isSingleton($code_point)
它會傳回一個布林值,表示代碼點是否為單字元
$is_non_starter_decomposition = isNonStDecomp($code_point)
它會傳回一個布林值,表示代碼點是否具有非起始分解。
$is_Full_Composition_Exclusion = isComp_Ex($code_point)
它會傳回衍生屬性 Comp_Ex (Full_Composition_Exclusion) 的布林值。此屬性由組合排除 + 單字元 + 非起始分解產生。
$NFD_is_NO = isNFD_NO($code_point)
它會傳回一個 NFD_NO (NFD_Quick_Check=No) 衍生屬性的布林值。
$NFC_is_NO = isNFC_NO($code_point)
它會傳回一個 NFC_NO (NFC_Quick_Check=No) 衍生屬性的布林值。
$NFC_is_MAYBE = isNFC_MAYBE($code_point)
它會傳回一個 NFC_MAYBE (NFC_Quick_Check=Maybe) 衍生屬性的布林值。
$NFKD_is_NO = isNFKD_NO($code_point)
它會傳回一個 NFKD_NO (NFKD_Quick_Check=No) 衍生屬性的布林值。
$NFKC_is_NO = isNFKC_NO($code_point)
它會傳回一個 NFKC_NO (NFKC_Quick_Check=No) 衍生屬性的布林值。
$NFKC_is_MAYBE = isNFKC_MAYBE($code_point)
它會傳回一個 NFKC_MAYBE (NFKC_Quick_Check=Maybe) 衍生屬性的布林值。
NFC
、NFD
、NFKC
、NFKD
:預設。
normalize
和其他一些函式:依要求。
由於這個模組會參考 Perl 核心在目錄 /lib/unicore(或舊版的 /lib/unicode)中的 Unicode 資料庫,因此這個模組所實作的正規化 Unicode 版本會取決於編譯到 Perl 中的版本。下表列出各種 Perl 版本附帶的預設 Unicode 版本。(可以將任何 Perl 版本中的 Unicode 版本變更為任何較早的 Unicode 版本,因此可以讓任何從 5.8.0 開始的 Perl 版本使用 Unicode 3.2。請閱讀 $Config{privlib}
/unicore/README.perl 以取得詳細資料。
perl's version implemented Unicode version
5.6.1 3.0.1
5.7.2 3.1.0
5.7.3 3.1.1 (normalization is same as 3.1.0)
5.8.0 3.2.0
5.8.1-5.8.3 4.0.0
5.8.4-5.8.6 4.0.1 (normalization is same as 4.0.0)
5.8.7-5.8.8 4.1.0
5.10.0 5.0.0
5.8.9, 5.10.1 5.1.0
5.12.x 5.2.0
5.14.x 6.0.0
5.16.x 6.1.0
5.18.x 6.2.0
5.20.x 6.3.0
5.22.x 7.0.0
在較舊的 Unicode 版本中,少數字元(到目前為止發現的都是 CJK 相容表意文字)可能有錯誤的分解對應(請參閱 lib/unicore/NormalizationCorrections.txt)。無論如何,這個模組既不會參考 lib/unicore/NormalizationCorrections.txt,也不會提供任何特定版本的正規化。因此,這個模組在較舊的 Perl 上執行,且具有較舊的 Unicode 資料庫時,可能會盲目地遵循 Unicode 資料庫,使用錯誤的分解對應。
在 Unicode 4.1.0 中,正規組合的定義 D2(影響 NFC 和 NFKC)已變更(請參閱公開檢閱議題 #29 和最近的 UAX #15)。這個模組自 0.07 版(2001 年 10 月 31 日)以來就已使用較新的定義。即使 Perl 實作的 Unicode 版本低於 4.1.0,這個模組也不會支援根據舊定義進行的正規化。
SADAHIRO Tomoyuki <SADAHIRO@cpan.org>
目前由 <perl5-porters@perl.org> 維護
版權所有(C) 2001-2012,SADAHIRO Tomoyuki。日本。保留所有權利。
此模組為免費軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
Unicode 標準化形式 - UAX #15
組成排除表
衍生的標準化屬性
標準化修正
公開檢閱議題 #29:標準化議題
應用程式中的正規等價性 - UTN #5