具有嵌入式十六进制编码的Java字符串

时间:2020-06-16 22:12:33

标签: java unicode

我调用一个库方法,该方法返回一个可序列化类型的对象。 在大多数情况下,该值是一个简单的String,因此我将返回的值强制转换为String。 我执行以下操作来检索字符串:

String val = (String)data.get("MyString");

但是,当检索到的字符串包含非ASCII时会出现问题。 例如,“Køllert”,返回的值显示为“ KxF8llert” ø用xF8代替,xF8是相应的Unicode十六进制值。

当我将值打印为字节时,字符打印为-8。

    byte[] defaultBytes = val.getBytes();
    for(int ii=0; ii<defaultBytes.length; ii++) print((int)defaultBytes[ii]);

有没有一种方法可以“清除”返回的字符串以使其可以作为标准Unicode打印,从而正确显示该字符。

编辑

当我按如下方式输入实际字符串时,可以正确打印该字符串,并且在检查字节时,该字符占用两个字节,其整数值为-61和-72。也许它返回的是UTF-8而不是Unicode?

    String val1 = "Køllert";
    byte[] defaultBytes1 = val1.getBytes();
    for(int ii=0; ii<defaultBytes1.length; ii++) print((int)defaultBytes1[ii]);

解决方案

很抱歉,这个问题可能含糊不清。 以下似乎对我有用。它不是那么复杂,但是让我旋转。

String val = new String(data.get("MyString").getBytes("UTF-8"));

2 个答案:

答案 0 :(得分:1)

也许它返回的是UTF-8而不是Unicode?

串行化产生一个字节流。将Java字符串(一种以UTF-16形式存储的Unicode字符序列)转换为字节流的一种明显,经济且无损的方法是将其转换为以UTF-8形式存储的Unicode字符序列。 / p>

(UTF-16和UTF-8是Unicode的有效表示形式)

鉴于存在将String转换为序列化形式的情况,所以不能跳过将序列化形式反向转换为String的情况。

为什么您以前进行序列化时都没有反向转换?

如果我们正确地猜想序列化的格式为UTF-8,则可以使用String(data.get(whatever))来转换为String。如果不是UTF-8,则是序列化代码的内部事务,并且大概提供了互补的解串器。

无论如何,您不能仅仅声称拥有的已经是String(即强制转换)来进行数据转换。

答案 1 :(得分:1)

我将评论作为答案,因为它似乎很有帮助。

正如我在上面的评论中所述,您可能想事先知道bytearray的字节元素将存储什么编码。

因此而不是stringObject.getBytes()-它使用平台的默认字符集将您的字符串编码为字节序列,并将结果存储到新的字节数组中,

您可能想使用

stringObject.getBytes("character-encoding")-使用给定的character-encoding将您的字符串编码为字节序列,并将结果存储到新的字节数组中。

您似乎应该使用上述版本的第二个版本,因为它将编码您的字符串into the given encoding