String.codePointAt究竟做了什么?

2022-09-01 06:43:07

最近,我在Java中遇到了CodePointAt的String方法。我还发现了其他一些codePoint方法:等。它们肯定与Unicode有关,但我不明白。codePointBeforecodePointCount

现在我想知道何时以及如何使用类似的方法。codePointAt


答案 1

简短的回答:它为您提供了从 中的指定索引开始的 Unicode 代码点。即该位置处字符的“unicode 编号”。String

更长的答案:Java是在16位(又名a)足以容纳任何存在的Unicode字符(这些部分现在被称为基本多语言平面或BMP)时创建的。后来,Unicode被扩展为包含代码点>216的字符。这意味着 a 不能再保存所有可能的 Unicode 码位。charchar

UTF-16是解决方案:它将“旧”Unicode码位存储在16位(即正好一个)中,并将所有新码位存储在32位(即两个值)中。这两个 16 位值称为“代理项对”。现在严格来说,a持有“UTF-16代码单元”,而不是像以前那样的“Unicode字符”。charcharchar

现在,只要您没有使用任何“新”Unicode字符(或者并不真正关心它们),所有“旧”方法(仅处理)都可以很好地使用,但是如果您也关心新字符(或者只需要具有完整的Unicode支持),那么您需要使用实际上支持所有可能的Unicode代码点的“代码点”版本。char

注意:一个非常著名的Unicode字符的例子不在BMP中(即仅在使用codepoint变体时工作)是表情符号:即使是简单的Grinning Face


答案 2