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])
它返回字符串中每个字符的分解的串联。
如果省略第二个参数(布尔值)或为假,则分解为规范分解;如果第二个参数(布尔值)为真,则分解为兼容分解。
返回的字符串并不总是处于 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
字符串应该至少包含一个组合字符或类似字符。例如,COMBINING ACUTE ACCENT
具有 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 4.1.0 中,规范组合的定义 D2(影响 NFC 和 NFKC)已更改(请参阅公共审查问题 #29 和最新的 UAX #15)。此模块从版本 0.07(2001 年 10 月 31 日)开始使用较新的定义。即使 perl 实现的 Unicode 版本低于 4.1.0,此模块也不会支持根据旧定义进行规范化。
SADAHIRO Tomoyuki <[email protected]>
当前维护者:<[email protected]>
版权所有(C) 2001-2012,SADAHIRO Tomoyuki。日本。保留所有权利。
本模块是自由软件;您可以根据与 Perl 本身相同的条款重新发布和/或修改它。
Unicode 规范化形式 - UAX #15
组合排除表
派生规范化属性
规范化校正
公开审查问题 #29:规范化问题
应用程序中的规范等效性 - UTN #5