gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:46 25 4
gpt4 key购买 nike

考虑以下代码:

byte aBytes[] = { (byte)0xff,0x01,0,0,
(byte)0xd9,(byte)0x65,
(byte)0x03,(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07,
(byte)0x17,(byte)0x33, (byte)0x74, (byte)0x6f,
0, 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, 0, fffd, 506, 717, 3374, 6f00, 102, 304, 500.

但是,如果将输入数据中的0xd9改为0x9d,则得到如下正确输出:

ff01, 0, 9d65, 304, 506, 717, 3374, 6f00, 102, 304, 500.

我意识到这个功能是因为字节 0xd9 是一个高代理 Unicode 标记。

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

最佳答案

编辑:这解决了评论中的问题

如果你想在字符串中编码任意二进制数据,你应该使用普通的文本编码。您在该编码中没有有效文本 - 您只有任意二进制数据。

Base64是去这里的路。 Java 中不直接支持 base64(无论如何在公共(public)类中),但是您可以使用各种第 3 方库,例如 the one in the Apache Commons Codec library .

是的,base64 会增加数据的大小 - 但它允许您稍后对其进行解码而不会丢失信息。

编辑:这解决了原始问题

我认为问题在于您没有指定合适的代理。您应该指定代表低代理项和高代理项的字节。之后,您应该能够添加适当的代码点。在您的情况下,您已经单独给出了一个低代理。

下面是演示这一点的代码:

public class Test
{
public static void main(String[] args)
throws Exception // Just for simplicity
{
byte[] data =
{
0, 0x41, // A
(byte) 0xD8, 1, // High surrogate
(byte) 0xDC, 2, // Low surrogate
0, 0x42, // B
};

String text = new String(data, "UTF-16");

System.out.printf("%x\r\n", text.codePointAt(0));
System.out.printf("%x\r\n", text.codePointAt(1));
// Code point at 2 is part of the surrogate pair
System.out.printf("%x\r\n", text.codePointAt(3));
}
}

输出:

41
10402
42

关于java - 处理 Java 字符串中的 Unicode 代理值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/965838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com