bvd*_*vdb 2 java encoding utf-16 character-encoding
我一直认为java用于UTF-16在内部对其字符进行编码.这是通过它使用u+xxxx格式来表示字符代码以及它使用16位来存储a这一事实来证实的char.
但有时UTF-16需要超过2个字节.在这种情况下,java需要2 char来表示1个UTF-16字符.
旁注:这让我想知道"java只支持Unicode字符集,并使用16位单元格存储字符"更为正确.
问题:第一个char提供了一些方法来确定char是否使用了第二个,或者2是否属于一个?
是的,UTF-16是在Unicode扩展时将Unicode 1.0的65536代码点限制传递到今天的1114112代码点限制时发明的.
这使它能够支持整个通用字符集,同时保持与UCS-2的兼容性; 所有Unicode字符的过时编码为双字节单位,因为它无法对Unicode 2.0或更高版本中的所有Unicode字符进行编码,因此已过时.
第一个char是否提供了一些方法来确定是否使用了第二个char,或者2是否属于一个?
是的,在UTF-16中,一个双字节单元是:
0xD800和0xDBFF包含之间,isHighSurrogate将返回true.0xDC00和0xDFFF包含之间,isLowSurrogate将返回true.非代理映射直接与相同代码点的BMP字符.
代理人结合起来代表星体平面人物:
在Java中,你可以先检查做到这一点isBmpCodePoint上int与代码点.如果这是真的那么你可以将其转换char为获得编码它的单个UTF-16单元.否则你可以打电话highSurrogate来获得第一个char并lowSurrogate获得第二个.
除了isBmpCodePoint你可以使用charCount哪个返回1BMP字符,2如果你需要代理.如果要创建一个1或多个2字符的数组来保存值,这将非常有用.
由于代理代码点从不分配字符,这意味着编码对于整个通用字符集是明确的.
它也是自我纠正,流中的错误可以被隔离,而不是导致所有其他字符被误读.例如,如果我们发现一个孤立的低代理,我们知道该位是错误的,但仍然可以读取流的其余部分.
一些完整的例子,但我不是太热了Java(另一方面,我知道的是Unicode,这是我用来回答这个问题的知识),所以如果有人发现了一个n00b的Java错误,但我认为我得到了Unicode-知识部分正确请继续编辑此帖子:
""是一个带有单个Unicode字符的字符串,U+10300它是Old Italic Alphabet中的一个字母.在大多数情况下,这些"星光层"人物,因为他们是半开玩笑地称为是比较晦涩的Unicode协会尽量,因为他们可以作为有用的,而不容易使用的BMP(基本多文种平面外去; U+0000到U+FFFF,虽然有时列为" U+0000来U+FFFD作为U+FFFE和U+FFFF都是非字,不应该在大多数情况下使用).
(如果你正在尝试这个,那么那些 directly will depend on how well your text editor copes with it).
If you examine "".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",对两个代理人使用逃脱.