Normalizing Text

规范化是一个过程,通过该过程您可以对文本进行某些转换,以使其与以前可能不同的方式协调。假设您要搜索或排序文本,在这种情况下,您需要对该文本进行规范化,以解决应表示为同一文本的代码点。

什么可以归一化?当需要转换带有变音符号的字符,更改所有字母的大小写,分解连字或将半角片假名字符转换为全角字符等时,可以使用规范化。

根据Unicode 标准附件#15,规范化器的 API 支持在java.text.Normalizer.Form中定义的以下所有四种 Unicode 文本规范化形式:

  • 归一化表格 D(NFD):规范分解

  • 规范化形式 C(NFC):规范分解,然后是规范组合

  • 规范化表格 KD(NFKD):兼容性分解

  • 规范化形式 KC(NFKC):兼容性分解,然后是规范组合

让我们研究一下如何使用以下归一化形式对带有小写字母的拉丁文小写字母“ o”进行归一化:

Original wordNFCNFDNFKCNFKD
"schön""schön""scho\u0308n""schön""scho\u0308n"

您会注意到,NFC 和 NFKC 中的原始单词保持不变。这是因为使用 NFD 和 NFKD,复合字符被 Map 到其规范分解。但是,如果可能的话,使用 NFC 和 NFKC 可以将组合的字符序列 Map 到复合文件。没有用于透析的复合材料,因此在 NFC 和 NFKC 中会分解。

在稍后表示的代码示例NormSample.java中,您还可以注意到另一个标准化功能。半角和全角片假名字符将具有相同的兼容性分解,因此是等效的兼容性。但是,它们不是规范的等效项。

为确保确实需要规范化文本,可以使用isNormalized方法确定给定的 char 值序列是否规范化。如果此方法返回 false,则意味着您必须对该序列进行规范化,并且应使用normalize方法,该方法根据指定的规范化形式对char值进行规范化。例如,要将文本转换为规范的分解形式,您将必须使用以下normalize方法:

normalized_string = Normalizer.normalize(target_chars, Normalizer.Form.NFD);

同样,normalize 方法将重音重排为正确的规范 Sequences,因此您不必担心自己的重音重排。

以下示例代表一个应用程序,使您能够选择标准化表格和模板进行标准化:

Note:

如果看不到 Servlets 正在运行,则需要至少安装Java SE 开发套件(JDK)7版本。

此 Servlets 的完整代码在NormSample.java中。