非基础平台的Unicode码点的进制数表达

文章探讨了Java中处理非基础平面Unicode字符的方式,特别是U+10000到U+10FFFF的补充字符。这些字符通过高代理和低代理组合存储,转换过程涉及码点计算,包括高位减去MIN_HIGH_SURROGATE,低位减去MIN_LOW_SURROGATE,然后与0x1_0000相加。MIN_SUPPLEMENTARY_CODE_POINT确保字符在20位范围内,而16位的char无法直接表示这些补充字符,所以需要高低代理对来区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非基础平台的Unicode码点的进制数表达

​ 从java的String类的码点获取中得知,U+10000 ~ U+10FFFF的字符并非直接存储值至char数组,而是会经过一定的转化。以下是思路(自己参考总结得出,并不一定契合原本意图)。

highSurrogate code unit:‘\uD800’ ~ ‘\uDBFF’;lowSurrogate code unit:‘\uDC00’ ~ ‘\uDFFF’。high-BIN_low-BIN通过以下格式转换成码点:

非基础平台的Unicode进制数转码点

= (hight-BIN - MIN_HIGH_SURROGATE) << 10 + (low-BIN - MIN_LOW_SURROGATE) + MIN_SUPPLEMENTARY_CODE_POINT

= (hight-BIN - 0xD800)<< 10 + (low-BIN - 0xDC00’) + 0x1_0000

= (hight-BIN & 0x3FF) << 10 | (low-BIN - 0x3FF) + 0x1_0000

= 截取hight-BIN的低10bit | 截取low-BIN的低10bit + 0x1_0000

‘\uD800’ ~ ‘\uDBFF’:1101_10|00_0000_0000 - 1101_10|11_1111_1111

‘\uDC00’ ~ ‘\uDFFF’:1101_11|00_0000_0000 - 1101_11|11_1111_1111

MIN_SUPPLEMENTARY_CODE_POINT的作用:Unicode字符的占bit至少需要21,因此用0x1_0000将其规范至20-bit group内。这里再将20-bit拆分两组10bit group,分别添加到\uD800和\uDC00的低位。但问题来了,第一平台的Unicode的占16bit,如何区分这两类所占char的不同,难道只是默认高位\uD800、\uDC00的情况表示非第一平台的Unicode字符?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值