但有时候UTF-16需要超过2个字节。在这种情况下,Java需要使用2个char来表示1个UTF-16字符。
顺便说一下:这让我想知道是否更正确地说“Java只支持Unicode字符集,并使用16位单元格存储字符”。
问题:第一个char是否提供某种方法来确定是否使用第二个char,或者这两个char属于一起?
以下是一些完整的示例,但我对Java不太熟悉(另一方面,我了解Unicode,并且这就是我用来回答这个问题的知识),所以如果有人发现一个n00b Java错误,但认为我在Unicode知识部分正确,请随时编辑此帖子:
""
是一个字符串,其中包含一个Unicode字符U+10300
,它是古意大利字母表中的一个字母。在大多数情况下,这些“星际平面”字符因为Unicode联盟试图尽可能有用而不超出更易使用的BMP(基本多语言平面;U+0000
至U+FFFF
,虽然有时列为"U+0000
至U+FFFD
,因为U+FFFE
和U+FFFF
都是非字符,在大多数情况下不应使用)而相对较少见。
(如果您正在进行实验,则直接使用的那些将取决于您的文本编辑器处理它的能力)。
如果您检查"".length
,您将得到2
,因为length
给出的是UTF-16编码单元的数量,而不是字符的数量。
new StringBuilder().appendCodePoint(0x10300).toString() == ""
应该返回true
。
Character.charCount(0x10300)
将返回2
,因为我们需要两个UTF-16 char
来编码它。Character.isBmpCodePoint(0x10300)
将返回false
。
Character.codePointAt("", 0)
将返回66304
,这是0x10300
,因为当它看到高代理项时,它包括在计算中读取以下低代理项。
Character.highSurrogate(0x10300) == 0xD800 && Character.lowSurrogate(0x10300) == 0xDF00
是正确的,因为这些是字符应该被分割为以在UTF-16中进行编码的高代理项和低代理项。
同样地,"".charAt(0) == 0xD800 && "".charAt(1) == 0xDF00
,因为charAt
处理的是UTF-16单元,而不是Unicode字符。
同样地,"" == "\uD800\uDF00"
,它使用转义序列来表示两个代理项。
Character.isHighSurrogate(char)
可以用来验证这个字符是否与下一个char
相连。 - bvdb