Java 带有嵌入式十六进制编码的字符串
Java String with Embedded Hex coding
我调用了一个库方法,returns 一个可序列化类型的对象。
在大多数情况下,该值是一个简单的字符串,因此我将返回值强制转换为字符串。
我执行以下操作来检索字符串:
String val = (String)data.get("MyString");
当检索到的字符串包含非 ascii 时出现问题。
例如 'Køllert',返回的值显示为 'KxF8llert'
'ø' 替换为对应的 Unicode 十六进制值 xF8。
当我将值打印为字节时,字符打印为 -8。
byte[] defaultBytes = val.getBytes();
for(int ii=0; ii<defaultBytes.length; ii++) print((int)defaultBytes[ii]);
有没有办法 'clean' 返回的字符串可以作为标准 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"));
Maybe it is returning UTF-8 instead of Unicode?
序列化产生一个字节流。将 Java 字符串(存储为 UTF-16 的 Unicode 字符序列)转换为字节流的明显、经济且无损的方法是将其转换为存储为 UTF 的 Unicode 字符序列-8.
(UTF-16 和 UTF-8 是 Unicode 的同等有效表示)
鉴于存在将 String 转换为序列化形式的过程,您无法跳过将序列化形式转换为 String 的反向转换。
为什么你用来做序列化的东西没有反向转换?
如果我们猜测序列化形式是 UTF-8 是正确的,那么要转换为字符串,您可以使用 String(data.get(whatever))
。如果它不是 UTF-8,那么它是序列化代码的内部业务,并且大概它提供了一个互补的反序列化器。
无论如何,你不能仅仅声称你拥有的已经是一个字符串(这就是一个转换)来进行数据转换。
我会把我的评论作为答案,因为它看起来很有帮助。
正如我在上面的评论中所述,您可能想事先知道 bytearray
的字节元素将存储的编码是什么。
因此而不是 stringObject.getBytes()
- 它使用平台的默认字符集将您的字符串编码为字节序列,将结果存储到新的字节数组中,
您可能想使用
stringObject.getBytes("character-encoding")
- 使用给定的 character-encoding
将您的字符串编码为字节序列,将结果存储到新的字节数组中。
看来您应该使用上面的第二个版本,因为它将对您的字符串进行编码 into the given encoding。
我调用了一个库方法,returns 一个可序列化类型的对象。 在大多数情况下,该值是一个简单的字符串,因此我将返回值强制转换为字符串。 我执行以下操作来检索字符串:
String val = (String)data.get("MyString");
当检索到的字符串包含非 ascii 时出现问题。 例如 'Køllert',返回的值显示为 'KxF8llert' 'ø' 替换为对应的 Unicode 十六进制值 xF8。
当我将值打印为字节时,字符打印为 -8。
byte[] defaultBytes = val.getBytes();
for(int ii=0; ii<defaultBytes.length; ii++) print((int)defaultBytes[ii]);
有没有办法 'clean' 返回的字符串可以作为标准 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"));
Maybe it is returning UTF-8 instead of Unicode?
序列化产生一个字节流。将 Java 字符串(存储为 UTF-16 的 Unicode 字符序列)转换为字节流的明显、经济且无损的方法是将其转换为存储为 UTF 的 Unicode 字符序列-8.
(UTF-16 和 UTF-8 是 Unicode 的同等有效表示)
鉴于存在将 String 转换为序列化形式的过程,您无法跳过将序列化形式转换为 String 的反向转换。
为什么你用来做序列化的东西没有反向转换?
如果我们猜测序列化形式是 UTF-8 是正确的,那么要转换为字符串,您可以使用 String(data.get(whatever))
。如果它不是 UTF-8,那么它是序列化代码的内部业务,并且大概它提供了一个互补的反序列化器。
无论如何,你不能仅仅声称你拥有的已经是一个字符串(这就是一个转换)来进行数据转换。
我会把我的评论作为答案,因为它看起来很有帮助。
正如我在上面的评论中所述,您可能想事先知道 bytearray
的字节元素将存储的编码是什么。
因此而不是 stringObject.getBytes()
- 它使用平台的默认字符集将您的字符串编码为字节序列,将结果存储到新的字节数组中,
您可能想使用
stringObject.getBytes("character-encoding")
- 使用给定的 character-encoding
将您的字符串编码为字节序列,将结果存储到新的字节数组中。
看来您应该使用上面的第二个版本,因为它将对您的字符串进行编码 into the given encoding。