java utf16_Java UTF16.isSurrogate方法代码示例

这段代码展示了如何使用Java的UTF16类进行字符分解操作,特别是在处理代理对(surrogate pairs)时。通过检查代码单元是否低于最小值或具有无关数据,然后使用UTF16.isSurrogate方法判断是否为代理字符,进一步处理Unicode代理对。

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

import com.ibm.icu.text.UTF16; //导入方法依赖的package包/类

public int decompose(CharSequence s, int src, int limit,

ReorderingBuffer buffer) {

int minNoCP=minDecompNoCP;

int prevSrc;

int c=0;

int norm16=0;

// only for quick check

int prevBoundary=src;

int prevCC=0;

for(;;) {

// count code units below the minimum or with irrelevant data for the quick check

for(prevSrc=src; src!=limit;) {

if( (c=s.charAt(src))

isMostDecompYesAndZeroCC(norm16=normTrie.getFromU16SingleLead((char)c))

) {

++src;

} else if(!UTF16.isSurrogate((char)c)) {

break;

} else {

char c2;

if(UTF16Plus.isSurrogateLead(c)) {

if((src+1)!=limit && Character.isLowSurrogate(c2=s.charAt(src+1))) {

c=Character.toCodePoint((char)c, c2);

}

} else /* trail surrogate */ {

if(prevSrc

--src;

c=Character.toCodePoint(c2, (char)c);

}

}

if(isMostDecompYesAndZeroCC(norm16=getNorm16(c))) {

src+=Character.charCount(c);

} else {

break;

}

}

}

// copy these code units all at once

if(src!=prevSrc) {

if(buffer!=null) {

buffer.flushAndAppendZeroCC(s, prevSrc, src);

} else {

prevCC=0;

prevBoundary=src;

}

}

if(src==limit) {

break;

}

// Check one above-minimum, relevant code point.

src+=Character.charCount(c);

if(buffer!=null) {

decompose(c, norm16, buffer);

} else {

if(isDecompYes(norm16)) {

int cc=getCCFromYesOrMaybe(norm16);

if(prevCC<=cc || cc==0) {

prevCC=cc;

if(cc<=1) {

prevBoundary=src;

}

continue;

}

}

return prevBoundary; // "no" or cc out of order

}

}

return src;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值