Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
Normalization (标准化) 是一个过程,通过该过程,你可以执行某些文本转换,使其可以之前没有的方式进行协调。假设你想要搜索或排序文本,在这种情况下,你需要将该文本规范化以考虑应该表示为相同文本的代码点。
什么可以规范化?当你需要使用变音符号转换字符,更改所有字母大小写,分解连字或将半角片假名字符转换为全角字符等时,标准化适用。
根据 Unicode Standard Annex #15,Normalizer 的 API 支持以下四种 Unicode 文本规范化形式,这些形式在 java.text.Normalizer.Form
:
让我们来看看如何通过使用这些规范化形式来标准化带有分音符的拉丁文小写字母“o”:
原单词 | NFC | NFD | NFKC | NFKD |
---|---|---|---|---|
"schön" | "schön" | "scho\u0308n" | "schön" | "scho\u0308n" |
你可以注意到原始单词在 NFC 和 NFKC 中保持不变。这是因为使用 NFD 和 NFKD,复合字符被映射到它们的规范化分解。但是对于 NFC 和 NFKC,如果可能的话,将组合字符序列映射到合成数据。没有复合分音符,所以在 NFC 和 NFKC 中保留分解。
在代码示例中,NormSample.java
(稍后表示),你还可以注意到另一个规范化功能。半宽和全宽片假名字符将具有相同的兼容性分解,因此是兼容性等价物。但是,它们不是规范的等价物。
为了确保你确实需要对文本进行规范化,可以使用 isNormalized
方法来确定给定的 char 值序列是否已规范化。如果此方法返回 false,则表示你必须对此序列进行规范化,并且应使用 normalize
方法,该方法根据指定的规范化形式规范化 char
值。例如,要将文本转换为规范化分解形式,你必须使用以下 normalize
方法:
normalized_string = Normalizer.normalize(target_chars, Normalizer.Form.NFD);
此外,normalize 方法会将重音重新排列为正确的规范顺序,因此你无需担心自己的重音重排。
以下示例表示一个应用程序,使你可以选择规范化形式和要规范化的模板:
此 applet 的完整代码位于 NormSample.java