內容

名稱

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 的情況下,答案必須為 YESNO。在 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) 衍生屬性的布林值。

EXPORT

NFCNFDNFKCNFKD:預設。

normalize 和其他一些函式:依要求。

CAVEATS

Perl 版本與 Unicode 版本

由於這個模組會參考 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 相同的條款下重新散布或修改它。

另請參閱

http://www.unicode.org/reports/tr15/

Unicode 標準化形式 - UAX #15

http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt

組成排除表

http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt

衍生的標準化屬性

http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt

標準化修正

http://www.unicode.org/review/pr-29.html

公開檢閱議題 #29:標準化議題

http://www.unicode.org/notes/tn5/

應用程式中的正規等價性 - UTN #5