规范化文本

原文: https://docs.oracle.com/javase/tutorial/i18n/text/normalizerapi.html

规范化是一个过程,通过它您可以执行某些文本转换,使其可以以前所未有的方式进行协调。假设您想要搜索或排序文本,在这种情况下,您需要将该文本规范化以考虑应该表示为相同文本的代码点。

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

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

  • 归一化形式 D(NFD):规范分解
  • 归一化形式 C(NFC):规范分解,然后是规范组合
  • 标准化表格 KD(NFKD):兼容性分解
  • 标准化形式 KC(NFKC):兼容性分解,然后是标准组合物

让我们来看看如何通过使用这些规范化形式来标准化带有分音符的拉丁文小写字母“o”:

原字 NFC NFD NFKC NFKD
“舍恩” “舍恩” “SCHO \ u0308n” “舍恩” “SCHO \ u0308n”

您可以注意到原始单词在 NFC 和 NFKC 中保持不变。这是因为使用 NFD 和 NFKD,复合字符被映射到它们的规范分解。但是对于 NFC 和 NFKC,如果可能的话,将组合字符序列映射到复合材料。没有用于分离的复合物,因此它在 NFC 和 NFKC 中被分解。

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

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

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

此外,normalize 方法会将重音重新排列为正确的规范顺序,因此您无需担心自己的重音重排。

以下示例表示一个应用程序,使您可以选择规范化表单和要规范化的模板:

<applet alt=”NormSample applet” archive=”examples/lib/NormSample.jar” code=”NormSample” height=”230” width=”550”><param name=”permissions” value=”sandbox”></applet>


Note: If you don’t see the applet running, you need to install at least the Java SE Development Kit (JDK) 7 release.


该 applet 的完整代码位于 NormSample.java