本教程适用于JDK 8。本页中描述的示例和实践不利用后续版本中引入的改进,可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发布说明。
规范化是一种处理文本的过程,可以通过某些转换使其在某些情况下变得可调和。假设你想要搜索或排序文本,在这种情况下,你需要规范化文本,以考虑应该表示为相同文本的代码点。
什么可以规范化?规范化适用于需要转换带有变音符号的字符、更改所有字母的大小写、分解连字或将半角片假名字符转换为全角字符等情况。
根据Unicode标准附录15,规范化器的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
方法来确定给定的字符序列是否已经规范化。如果此方法返回false,表示你需要规范化此序列,并且应该使用normalize
方法根据指定的规范化形式规范化char
值。例如,要将文本转换为规范分解形式,你将需要使用以下normalize
方法:
normalized_string = Normalizer.normalize(target_chars, Normalizer.Form.NFD);
此外,normalize方法会将重音符号重新排列为正确的规范顺序,因此您不必担心自己的重音符号重新排列。
以下示例表示一个应用程序,使您能够选择标准化形式和标准化模板:
此小程序的完整代码在NormSample.java
中。