返回
详解红宝书:第五章基本引用类型之String.normalize()方法揭秘
前端
2023-09-23 15:15:25
第五章 红宝书:基本引用类型揭秘 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()方法可以用于多种场景,比如:
- 比较字符串 :将字符串转换为规范形式后,可以比较字符串是否相等。这对于比较来自不同来源的字符串非常有用。
- 搜索字符串 :将字符串转换为规范形式后,可以搜索字符串中是否包含某个子字符串。这对于搜索来自不同来源的字符串非常有用。
- 排序字符串 :将字符串转换为规范形式后,可以对字符串进行排序。这对于对来自不同来源的字符串进行排序非常有用。