在UTF-16到UTF-8的转换中,如何处理UTF-16中的代理对(surrogate pair)?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
当UTF-16字符在\uD800到\uDFFF范围内时,可能是代理对的一部分。如果第一个字符(高代理项)在\uD800到\uDBFF之间,并且后面紧跟一个字符(低代理项)在\uDC00到\uDFFF之间,则它们组成一个代理对,表示一个Unicode码点。转换时,需要将这两个代理项合并为一个Unicode码点,然后按照UTF-8的4字节格式编码。具体代码为:
if (c >= '\uD800' && c < '\uE000') {
// ...(省略部分代码)
uc = (c << 10) + d + 0xfca02400;
dest[dp++] = (byte) (0xf0 | ((uc >> 18)));
dest[dp++] = (byte) (0x80 | ((uc >> 12) & 0x3f));
dest[dp++] = (byte) (0x80 | ((uc >> 6) & 0x3f));
dest[dp++] = (byte) (0x80 | (uc & 0x3f));
off++; // 跳过低代理项
}