内容

名称

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 的情况下,答案必须是 YESNO。在 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)。

EXPORT

NFC, NFD, NFKC, NFKD: 默认情况下。

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 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 本身相同的条款重新发布和/或修改它。

另请参阅

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