有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

嵌入十六进制编码的unicode Java字符串

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

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) 个答案

  1. # 1 楼答案

    Maybe it is returning UTF-8 instead of Unicode?

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

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

    假设字符串转换为序列化形式,则不能跳过将序列化形式转换为字符串的反向转换

    为什么在你用来序列化的东西中没有反向转换呢

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

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

  2. # 2 楼答案

    我将把我的评论作为回答,因为它似乎很有帮助

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

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

    您可能想使用

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

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