返回

详解红宝书:第五章基本引用类型之String.normalize()方法揭秘

前端

第五章 红宝书:基本引用类型揭秘 String.normalize()方法剖析

5.3.3 String.normalize()方法

某些Unicode字符可以有多种编码方式。有的字符可能有多种视觉形式,比如:“ü”既可以表示成一个预组合字符“\u00fc”,也可以表示成两个分解字符“u”和“¨”。预组合字符是指将多个字符组合成一个字符表示的形式,分解字符是指将一个字符分解成多个字符表示的形式。

“ü”的预组合字符“\u00fc”在UTF-8编码下表示为两个字节,而分解字符“u”和“¨”在UTF-8编码下分别表示为一个字节。因此,预组合字符“\u00fc”在UTF-8编码下比分解字符“u”和“¨”占用更多的空间。

String.normalize()方法可以将字符串中的字符转换为规范形式。规范形式是指一组字符的唯一表示形式。String.normalize()方法有两种规范形式:NFC和NFKD。

  • NFC(Normalization Form Canonical Composition) :将字符串中的所有预组合字符转换为分解字符,并将字符串中的所有分解字符转换为预组合字符。
  • NFKD(Normalization Form Canonical Decomposition) :将字符串中的所有预组合字符转换为分解字符,但不会将字符串中的所有分解字符转换为预组合字符。

以下示例演示了String.normalize()方法的用法:

String str1 = "ü";
String str2 = "\u00fc";

System.out.println(str1.normalize(NormalizationForm.NFC)); // ü
System.out.println(str2.normalize(NormalizationForm.NFC)); // ü

System.out.println(str1.normalize(NormalizationForm.NFKD)); // u¨
System.out.println(str2.normalize(NormalizationForm.NFKD)); // u¨

输出结果为:

ü
ü
u¨
u¨

从输出结果可以看出,String.normalize()方法可以将字符串中的字符转换为规范形式。NFC和NFKD两种规范形式的区别在于,NFC会将分解字符转换为预组合字符,而NFKD不会。

String.normalize()方法可以用于多种场景,比如:

  • 比较字符串 :将字符串转换为规范形式后,可以比较字符串是否相等。这对于比较来自不同来源的字符串非常有用。
  • 搜索字符串 :将字符串转换为规范形式后,可以搜索字符串中是否包含某个子字符串。这对于搜索来自不同来源的字符串非常有用。
  • 排序字符串 :将字符串转换为规范形式后,可以对字符串进行排序。这对于对来自不同来源的字符串进行排序非常有用。