Java String with Embedded Hex coding



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

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

但是,当检索到的字符串包含非ASCII时,存在问题。 例如,"Køllert",返回的值显示为"KxF8llert" "ø"被替换为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"));

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

序列化生成字节流。 将 Java 字符串(存储为 UTF-16 的 Unicode 字符序列(转换为字节流的明显、经济且无损耗的方法是将其转换为存储为 UTF-8 的 Unicode 字符序列。

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

鉴于存在将字符串转换为序列化形式,则不能跳过序列化表单到字符串的反向转换。

为什么在你用来进行序列化的任何东西中没有反向转换?

如果我们猜测序列化形式是 UTF-8 是正确的,那么要转换为字符串,请使用String(data.get(whatever)). 如果它不是 UTF-8,那么它是序列化代码的内部业务,大概它提供了一个互补的反序列化程序。

无论如何,你不能通过仅仅声称你所拥有的已经是一个字符串(这就是强制转换(来进行数据转换。

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

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

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

您可能希望使用stringObject.getBytes("character-encoding")- 它使用

给定的character-encoding将字符串编码为字节序列,将结果存储到新的字节数组中。

似乎您应该使用上述的第二个版本,因为它会将您的字符串编码为给定的编码。

最新更新