关于Java:String.codePointAt到底能做什么?

What exactly does String.codePointAt do?

最近,我遇到了Java中String的codePointAt方法。 我还发现了其他一些codePoint方法:codePointBeforecodePointCount等。它们确实与Unicode有关,但我不理解。

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


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

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

解决方案是UTF-16:它以16位(即正好为一个char)存储"旧" Unicode代码点,并以32位(即为两个char值)存储所有新的Unicode代码点。这两个16位值称为"代理对"。现在严格来说,char拥有一个" UTF-16代码单元",而不是以前的" Unicode字符"。

现在,只要您不使用任何"新" Unicode字符(或不太在乎它们),就可以使用所有"旧"方法(仅处理char),但是如果您关心的话有关新字符的信息(或仅需要完整的Unicode支持),那么您将需要使用实际上支持所有可能的Unicode代码点的"代码点"版本。

注意:Emojis是不在BMP中的unicode字符的一个众所周知的示例(即,仅在使用codepoint变体时才起作用)是Emojis:即使是简单的咧嘴笑脸? U + 1F600不能用单个char表示。


代码点支持65535以上的字符,即Character.MAX_VALUE。

如果您的文字具有如此高的字符,则必须使用代码点或int而不是char

通过支持UTF-16可以做到这一点,它可以使用一个或两个16位char并将其转换为int

AFAIK,通常只有最近添加的补充多语言字符和表意文字(例如非繁体中文)才需要。


简而言之,只要您在Java中使用默认字符集,就很少用:)但是要获得更详细的解释,请尝试以下文章:

将字符与代码点进行比较?
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html
http://javarevisited.blogspot.com/2012/01/java-string-codepoint-get-unicode.html

希望这有助于为您澄清事情:)