加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

处理Java字符串中的Unicode代理值

发布时间:2020-12-14 05:51:17 所属栏目:Java 来源:网络整理
导读:请考虑以下代码: byte aBytes[] = { (byte)0xff,0x01,(byte)0xd9,(byte)0x65,(byte)0x03,(byte)0x04,(byte)0x05,(byte)0x06,(byte)0x07,(byte)0x17,(byte)0x33,(byte)0x74,(byte)0x6f,1,2,3,4,5,0 };String sCompressedBytes = new String(aBytes,"UTF-16")
请考虑以下代码:
byte aBytes[] = { (byte)0xff,0x01,(byte)0xd9,(byte)0x65,(byte)0x03,(byte)0x04,(byte)0x05,(byte)0x06,(byte)0x07,(byte)0x17,(byte)0x33,(byte)0x74,(byte)0x6f,1,2,3,4,5,0 };
String sCompressedBytes = new String(aBytes,"UTF-16");
for (int i=0; i<sCompressedBytes.length; i++) {
    System.out.println(Integer.toHexString(sCompressedBytes.codePointAt(i)));
}

获取以下不正确的输出:

ff01,fffd,506,717,3374,6f00,102,304,500.

但是,如果输入数据中的0xd9更改为0x9d,则可以获得以下正确的输出:

ff01,9d65,500.

我意识到功能是因为字节0xd9是高代数Unicode标记.

问题:有没有办法在Java Unicode字符串中提供,识别和提取代理字节(0xd800到0xdfff)?
谢谢

解决方法

Is there a way to feed,identify and extract surrogate bytes (0xd800 to 0xdfff) in a Java Unicode string?

只是因为没有人提到它,我会指出,Character课程包括使用代理对的方法.例如. isHighSurrogate(char),codePointAt(CharSequence,int)和toChars(int).我意识到这是除了说明的问题之外.

new String(aBytes,"UTF-16");

这是一个将转换输入数据的解码操作.我很确定它是不合法的,因为所选的解码操作要求输入以0xfe 0xff或0xff 0xfe(byte order mark)开头.另外,由于UTF-16是variable width encoding,因此不是每个可能的字节值都能正确解码.

如果您想要将任意字节对称转换为String并返回,则最好使用8位单字节编码,因为每个字节值都是有效字符:

Charset iso8859_15 = Charset.forName("ISO-8859-15");
byte[] data = new byte[256];
for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {
  data[i - Byte.MIN_VALUE] = (byte) i;
}
String asString = new String(data,iso8859_15);
byte[] encoded = asString.getBytes(iso8859_15);
System.out.println(Arrays.equals(data,encoded));

注意:字符数将等于字节数(数据大小加倍);所得到的字符串不一定是可打印的(包含它可能是bunch of control characters).

我是with Jon,尽管把任意字节序列放入Java字符串几乎总是一个坏主意.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读