String.codePointAt究竟做了什么?

Mic*_*ael 34 java string unicode codepoint

最近我遇到了Java中的StringPointAt方法.我还发现了一些其他的代码点方法:codePointBefore,codePointCount等他们肯定有事情做Unicode的,但我不明白.

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

Joa*_*uer 51

简短回答:它为您提供从指定索引开始的Unicode代码点String.即该位置角色的"unicode number".

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

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

现在所有的"旧"方法(仅处理char)只要你没有使用任何"新的"Unicode字符(或者并不真正关心它们)就可以使用,但是如果你关心新的字符也是(或者只需要完整的Unicode支持),那么你需要使用实际支持所有可能的Unicode代码点的"codepoint"版本.

注意:一个众所周知的不在BMP中的unicode字符的例子(即仅在使用代码点变体时才起作用)是Emojis:即使是简单的Grinning Face U + 1F600也不能用单个表示char.


Pet*_*rey 5

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

如果您的文字具有如此高的字符,则必须使用代码点或int代替chars.

它不支持UTF-16,它可以使用一个或两个16位字符并将其转换为 int

AFAIK,通常这只是最近添加的补充多语言补充表意文字字符所必需的,例如非繁体中文.

  • 好吧,不是*只*非传统中文:https://en.wikipedia.org/wiki/Plane_(Unicode)许多鲜为人知的语言,一些数学符号,表情符号和几乎所有引入Unicode的内容相对较近的生活在BMP之外.这里有[相关问题](http://stackoverflow.com/questions/5567249/what-are-the-most-common-non-bmp-unicode-characters-in-actual-use). (5认同)