Java Surrogate, isHighSurrogate, isLowSurrogate 是什么? 按字节截取emoji

简单的说就是Java 语言内部的字符信息是使用 UTF-16 编码。因为char 这个类型是 16-bit 的。它可以有65536种取值,即65536个编号,每个编号可以代表1种字符。

65536 不够用。因此就从这65536个编号里,拿出2048个,规定它们是「Surrogates」,让它们两个为一组,来代表编号大于65536的那些字符。 更具体地,编号为 U+D800 至 U+DBFF 的规定为「High Surrogates」,共1024个。编号为 U+DC00至 U+DFFF 的规定为「Low Surrogates」,也是1024个。它们两两组合出现,就又可以多表示1048576种字符。

如果你丢失一个高位代理Surrogates或者低位代理Surrogates,就会出现乱码。这就是为什么emoji会出现乱码了。

 

例如我们输入了一个emoji:😆

假如可以写成这样:\uD83D\uDC34

String s = '\uD83D' + '\uDC34' + "";

那么我们在按字节截取s的时候,就要考虑这个字符是不是高位代理Surrogates或者低位代理Surrogates,避免出现半个字符。

判断方法:

Character.isLowSurrogate(c)
Character.isHighSurrogate(c)

 字符编码相关的可以参考:【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?

相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页